[英]In Data.Data, why does gmapM take a Monad rather than an applicative?
例如,如果要实现MonoTraversable
, gmapM
似乎是基于Data.Data
编写泛型遍历的明显候选MonoTraversable
。 唯一的麻烦是它需要Monad
而不是Applicative
。 这是为什么? 另外,在假设较弱的情况下,是否有与fmapM
类似的功能?
它看起来像是实施Monad-Applicative建议之前的历史细节。
我可以同时定义gmapM
默认和方面的实例列表Applicative
。
gmapM :: forall m a. (Data a, Applicative m) => (forall d. Data d => d -> m d) -> a -> m a
gmapM f = gfoldl k pure
where
k :: Data d => m (d -> b) -> d -> m b
k c x = c <*> f x
-- instance Data a => Data [a] where ...
gmapMlist :: forall m a. (Data a, Applicative m) => (forall d. Data d => d -> m d) -> [a] -> m [a]
gmapMlist _ [] = pure []
gmapMlist f (x:xs) = (:) <$> f x <*> f xs
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.