۲۰ - ۵کاربرد Traversable چیه؟

کلامی بخوایم بگیم، وقتایی که می‌خواین دوتا ساختار رو با هم جابجا کنین، یا بخواین اول یه چیزی رو نگاشت کنین بعد ساختارها رو جابجا کنین، احتمالاً ‏‎Traversable‎‏ لازم دارین:

sequenceA :: (Applicative f, Traversable t)
          => t (f a) -> f (t a)

traverse :: Applicative f
         => (a -> f b) -> t a -> f (t b)

با چندتا تابع و مقادیرِ فرضی (بدون اینکه تعریف‌شون کنیم) تو REPL بازی می‌کنیم تا ببینیم کِی ممکنه ‏‎traverse‎‏ یا ‏‎sequenceA‎‏ بخوایم:

Prelude> let f = undefined :: a -> Maybe b
Prelude> let xs = undefined :: [a]
Prelude> :t map f xs
map f xs :: [Maybe b]

اگه یه مقدار با تایپ ‏‎Maybe [b]‎‏ بخوایم چطور؟ کُدِ زیر کار می‌کنه، ولی بهتر هم میشه نوشت:

Prelude> :t sequenceA $ map f xs
sequenceA $ map f xs :: Maybe [a]

هر وقت یه ‏‎sequence‎‏ یا ‏‎sequenceA‎‏ رو با ‏‎map‎‏ یا ‏‎fmap‎‏ دیدین، معمولاً بهتره با ‏‎traverse‎‏ جایگزین بشن:

Prelude> :t traverse f xs
traverse f xs :: Maybe [b]

الان کاربردِ اینها در مثال‌های واقعی رو می‌بینیم.