【发布时间】:2019-07-28 13:16:04
【问题描述】:
sequenceA :: Applicative f => [f a] -> f [a]
sequenceA [] = pure []
sequenceA (x:xs) = pure (:) <*> x <*> sequenceA xs
来自Programming in Haskell by Hutton
seqn :: Monad m => [m a] -> m [a]
并且是它的实现
seqn [] = return []
seqn (act:acts) = do x<- act
xs <- seqn acts
return (x:xs)
seqn和sequenceA有什么关系和区别?
既然 monad 是一个应用程序,那么 seqn 和 sequenceA 是否仅限于 monad?
【问题讨论】:
-
seqn我猜你的意思是sequence? (我也完全同意@AJFarmar 的评论。) -
@RobinZigmond,我应该注意到
sequence和mapM并不完全是退化的。例如,vector的流融合系统允许mapM比traverse更好地实现。 -
这里真正的问题似乎是,
<*>到底是什么以及它如何与一元>>=相关联?当然,这个问题只对同时具有这两个实例的类型有意义。在这种情况下,(<*>)=ap(看看它们的类型,如果我们在它们的约束中交换Applicative和Monad(类型的一部分看起来像Monad a => ...),它们是完全相同的)。和apis defined 就do而言,即>>=。 -
sequence是 突出的例子,Applicative是 originally introduced / 发明 / 发现的。您可以搜索“Monad 和 Applicative 之间的差异”(此处为 SO 和其他地方)以获取更多上下文。这是one example。 -
更多关于 Monad / Applicative 对应(a.o.t. 差异)是例如here。但是某些类型允许更专业(也许更有效)实现
<*>a.o.t。只使用ap。对于此类类型,sequence和sequenceA不一定完全相同。这能回答你的问题吗?
标签: list haskell monads applicative