Traversable型クラス
左から右へなめて作用を各点ごとに評価可能な型クラス
Haskell
code:hs
class (Functor t, Foldable t) => Traversable t where
traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
sequenceA :: Applicative f => t (f a) -> f (t a)
mapM :: Monad m => (a -> m b) -> t a -> m (t b)
sequence :: Monad m => t (m a) -> m (t a)
table:4つのmethodを持つ
Applicative版 Monad版
traverseかsequenceAのいずれかを定義すればあとは自動的に決まる
Applicative版の方のいずれか1つを定義すれば良い
なので結局1つの定義で済むmrsekut.icon
PureScript
code:purs(hs)
class (Functor t, Foldable t) <= Traversable t where
traverse :: forall a b m. Applicative m => (a -> m b) -> t a -> m (t b)
sequence :: forall a m. Applicative m => t (m a) -> m (t a)
その他の関数
code:hs
forM :: (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b)
forM = flip mapM
code:hs
for :: (Traversable t, Applicative f) => t a -> (a -> f b) -> f (t b)
for = flip traverse
参考
めちゃくちゃ良い
Traversableクラスの各メソッドが,「データ構造」とApplicativeやモナドのような「計算を行うコンテナ」の入れ子関係を入れ替える性質を持っている
この性質により,Applicativeやモナドのような計算コンテナを使って処理を行い,最終結果を計算コンテナから取り出すといった処理を簡単に書ける
入り組んだ構造の値を平坦な構造に変換できる
構造を保つ
code:hs
traverse Identity = Identity -- identity
t . traverse f = traverse (t . f) -- naturality
「舐めてからmap」と「舐めるときにmap」が等しくなる