[医]百叶草提供可遍历的:
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)一个很好的练习是找出默认实现应该是什么:给定遍历或sequenceA,您将如何定义其他三种方法?
我想出了以下类型检查的代码:
class (Functor t, Foldable t) => MyTraversable t where
traverse' :: Applicative f => (a -> f b) -> t a -> f (t b)
traverse' = error "..."
sequenceA' :: Applicative f => t (f a) -> f (t a)
sequenceA' f = traverse' id f
mapM :: Monad m => (a -> m b) -> t a -> m (t b)
mapM = traverse'
sequence' :: Monad m => t (m a) -> m (t a)
sequence' = sequenceA'如果我对mapM和sequence'的实现是正确的,并且,因为每个Monad都是一个应用程序:
λ: :i Monad
class Applicative m => Monad (m :: * -> *) where
...那么,我还不清楚为什么mapM和sequence'是必要的。他们为什么要这样?
发布于 2015-12-28 09:51:26
正如注释中提到的那样,有一段时间并不是每个Monad都是Applicative。就在最近(在与GHC7.10一起发布的base-4.8中),Applicative成为了Monad的超类。你可能见过申请-单提案,AMP。
目前,没有回程,MRP (电子邮件线程)正在工作,这将使Monad的>>和Applicative的*>保持一致。这最终将使人们有可能说出traverse = mapM和sequence = sequenceA。但这是一个漫长的过程,需要时间。
所以回答你的问题:出于历史原因。
https://stackoverflow.com/questions/34487395
复制相似问题