私はこのコードを持っています:
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 の一般的な実装を考え出すことはできますか?
編集:古いバージョンのハグにはこの機能が実装されていることに気付きました。ただし、コードが見つかりません。ここで、同じことを達成するために折り畳み式/トラバーサブルを使用することをお勧めします。