首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Traversable#mapM &序列-必要吗?

Traversable#mapM &序列-必要吗?
EN

Stack Overflow用户
提问于 2015-12-28 03:37:46
回答 1查看 205关注 0票数 1

[医]百叶草提供可遍历的:

代码语言:javascript
复制
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,您将如何定义其他三种方法?

我想出了以下类型检查的代码:

代码语言:javascript
复制
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'

如果我对mapMsequence'的实现是正确的,并且,因为每个Monad都是一个应用程序:

代码语言:javascript
复制
λ: :i Monad
class Applicative m => Monad (m :: * -> *) where
...

那么,我还不清楚为什么mapMsequence'是必要的。他们为什么要这样?

贺福雷帮助我解决了sequenceA问题,我对此表示感谢。

EN

回答 1

Stack Overflow用户

发布于 2015-12-28 09:51:26

正如注释中提到的那样,有一段时间并不是每个Monad都是Applicative。就在最近(在与GHC7.10一起发布的base-4.8中),Applicative成为了Monad的超类。你可能见过申请-单提案,AMP

目前,没有回程,MRP (电子邮件线程)正在工作,这将使Monad>>Applicative*>保持一致。这最终将使人们有可能说出traverse = mapMsequence = sequenceA。但这是一个漫长的过程,需要时间。

所以回答你的问题:出于历史原因。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34487395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档