我有这个代码:
fmapM :: Monad m => (a -> m b) -> (t, a) -> m (t, b)
fmapM f (id, e) = do
ev <- f e
return (id, ev)
它基本上将该函数应用于元组中的第二个元素,然后“提取”单子。由于元组是一个函子,有没有办法为所有函子推广它?我想不出一个实现,但类型签名应该是:
fmapM :: (Monad m, Functor f) => (a -> m b) -> f a -> m f b
第二步似乎是一个“序列”操作,它从另一个函子(列表)中提取单子。但是序列并没有推广到所有的函子。你能想出一个通用的 fmapM 实现吗?
编辑:我意识到旧版本的拥抱确实实现了这个功能。但是,我找不到代码。现在,建议我使用可折叠/可遍历来实现相同的目的。