【问题标题】:What is the relation and difference between `seqn` and `sequenceA`?`seqn` 和 `sequenceA` 之间的关系和区别是什么?
【发布时间】: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)

seqnsequenceA有什么关系和区别?

既然 monad 是一个应用程序,那么 seqnsequenceA 是否仅限于 monad?

【问题讨论】:

  • seqn 我猜你的意思是sequence? (我也完全同意@AJFarmar 的评论。)
  • @RobinZigmond,我应该注意到sequencemapM 并不完全是退化的。例如,vector 的流融合系统允许 mapMtraverse 更好地实现。
  • 这里真正的问题似乎是,&lt;*&gt; 到底是什么以及它如何与一元 &gt;&gt;= 相关联?当然,这个问题只对同时具有这两个实例的类型有意义。在这种情况下,(&lt;*&gt;) = ap(看看它们的类型,如果我们在它们的约束中交换ApplicativeMonad(类型的一部分看起来像Monad a =&gt; ...),它们是完全相同的)。和ap is defineddo 而言,即&gt;&gt;=
  • sequence 突出的例子,Applicativeoriginally introduced / 发明 / 发现的。您可以搜索“Monad 和 Applicative 之间的差异”(此处为 SO 和其他地方)以获取更多上下文。这是one example
  • 更多关于 Monad / Applicative 对应(a.o.t. 差异)是例如here。但是某些类型允许更专业(也许更有效)实现&lt;*&gt; a.o.t。只使用ap。对于此类类型,sequencesequenceA 不一定完全相同。这能回答你的问题吗?

标签: list haskell monads applicative


【解决方案1】:

从您添加的书 (here) 的链接中,seqn 的类型是:

seqn :: Monad m -> [m a] -> m [a]

它的实现是:

seqn [] = return []
seqn (act:acts) = do 
                     x  <- act 
                     xs <- seqn acts
                     return (x:xs)

如果你看一下sequenceA的类型定义:

sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)

更通用,因为 Monad 是一个应用程序,而您的实现:

sequenceA []     = pure []
sequenceA (x:xs) = pure (:) <*> x <*> sequenceA xs

seqn基本相同

编辑:

回答cmets中的问题 我问了一个新问题,以了解彼此之间的差异。希望能帮助到你: Proving equality of functions from Applicative and Monad

总结

Haskell 中没有用于应用程序的 do 表示法,您可以在 this segment 中专门阅读。 这是一篇非常好的文章:Desugaring Haskell’s do-Notation into Applicative Operations,它的主要思想是如果你想知道的话,如何将单子的 do 符号脱糖成应用程序。 returnpure 做的完全一样,但是有不同的约束,对吧?所以这部分 pure (:) 和这部分 return (x:xs) 你可以看到它们被覆盖了。 然后,在这里x &lt;- act 你得到act 的值,然后是递归xs &lt;- seqn acts 的值,最后用return 包装它。

这就是pure (:) &lt;*&gt; x &lt;*&gt; sequenceA xs 的本质所在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多