ابتدای محتوای صفحه
۲۰ - ۵کاربرد 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]الان کاربردِ اینها در مثالهای واقعی رو میبینیم.