generated at
Traversable型クラス
左から右へなめて作用を各点ごとに評価可能な型クラス

Haskell
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)
traverseかsequenceAのいずれかを定義すればあとは自動的に決まる
Applicative版の方のいずれか1つを定義すれば良い
なので結局1つの定義で済むmrsekut
traverseを定義することが多い


PureScript
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)


その他の関数
mapMの引数を入れ替えた関数
hs
forM :: (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b) forM = flip mapM
traverseの引数を入れ替えた関数
hs
for :: (Traversable t, Applicative f) => t a -> (a -> f b) -> f (t b) for = flip traverse




参考
めちゃくちゃ良い



Traversableクラスの各メソッドが,「データ構造」とApplicativeやモナドのような「計算を行うコンテナ」の入れ子関係を入れ替える性質を持っている
この性質により,Applicativeやモナドのような計算コンテナを使って処理を行い,最終結果を計算コンテナから取り出すといった処理を簡単に書ける
入り組んだ構造の値を平坦な構造に変換できる
これは例を見ないとわからん #??


構造を保つ
hs
traverse Identity = Identity -- identity t . traverse f = traverse (t . f) -- naturality
「舐めてからmap」と「舐めるときにmap」が等しくなる