6

私はこのコードを持っています:

fmapM :: Monad m => (a -> m b) -> (t, a) -> m (t, b)
fmapM f (id, e) = do 
  ev <- f e
  return (id, ev)

基本的にタプルの2番目の要素に関数を適用し、モナドを「抽出」します。タプルはファンクターなので、これをすべてのファンクターに一般化する方法はありますか? 実装は考えられませんが、型シグネチャは次のようにする必要があります。

fmapM :: (Monad m, Functor f) => (a -> m b) -> f a -> m f b

2番目のステップは、別のファンクター(リスト)からモナドを抽出する「シーケンス」操作になるようです。しかし、シーケンスはすべてのファンクターに一般化されているわけではありません。fmapM の一般的な実装を考え出すことはできますか?

編集:古いバージョンのハグにはこの機能が実装されていることに気付きました。ただし、コードが見つかりません。ここで、同じことを達成するために折り畳み式/トラバーサブルを使用することをお勧めします。

4

1 に答える 1