আমি মনে করি এটি নীচের হিসাবে সংজ্ঞায়িত করা যেতে পারে sequenceA
, শর্তাবলী বোঝা সবচেয়ে সহজ traverse
।
traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)
traverse f = sequenceA . fmap f
sequenceA
বাম থেকে ডানে একটি কাঠামোর উপাদানগুলিকে এক সাথে সিক্যুয়েন্স করে ফলাফল সমান আকৃতির একটি কাঠামো ফিরিয়ে আনতে।
sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)
sequenceA = traverse id
আপনি sequenceA
দুটি ফান্টারের ক্রমকে বিপরীত হিসাবেও ভাবতে পারেন , উদাহরণস্বরূপ কর্মের একটি তালিকা থেকে ফলাফলের তালিকা ফিরিয়ে দেওয়া কোনও ক্রিয়ায়।
সুতরাং traverse
কিছু কাঠামো লাগে এবং কাঠামোর f
প্রতিটি উপাদানকে কিছু আবেদনকারীতে রূপান্তরিত করার জন্য প্রয়োগ করা হয়, এটি ফলস্বরূপ একই আকৃতির একটি কাঠামো ফিরিয়ে দিয়ে বাম থেকে ডানে সেই আবেদনকারীদের প্রভাবগুলির ক্রমগুলি সিকোয়েন্স করে।
আপনি এটির সাথে তুলনাও করতে পারেন Foldable
, যা সম্পর্কিত ফাংশনটি সংজ্ঞায়িত করে traverse_
।
traverse_ :: (Foldable t, Applicative f) => (a -> f b) -> t a -> f ()
আপনি দেখতে পারেন সুতরাং যে মধ্যবর্তী কী পার্থক্য Foldable
এবং Traversable
যে আধুনিক, যেহেতু সাবেক কিছু অন্যান্য মান মধ্যে ফলাফলের ভাঁজ করতে হবে আপনি কাঠামোর আকৃতি সংরক্ষণ করার মঞ্জুরি দেয়।
এর ব্যবহারের একটি সাধারণ উদাহরণটি একটি তালিকাটিকে ট্র্যাভারেবল কাঠামো এবং IO
প্রয়োগকারী হিসাবে ব্যবহার করছে:
λ> import Data.Traversable
λ> let qs = ["name", "quest", "favorite color"]
λ> traverse (\thing -> putStrLn ("What is your " ++ thing ++ "?") *> getLine) qs
What is your name?
Sir Lancelot
What is your quest?
to seek the holy grail
What is your favorite color?
blue
["Sir Lancelot","to seek the holy grail","blue"]
যদিও এই উদাহরণটি বরং উদ্বেগজনক, traverse
অন্য ধরণের পাত্রে ব্যবহার করা বা অন্যান্য প্রয়োগকারী ব্যবহার করার সময় জিনিসগুলি আরও আকর্ষণীয় হয়ে ওঠে ।