list - `seqn` 和 `sequenceA` 之间的关系和区别是什么?
问题描述
sequenceA :: Applicative f => [f a] -> f [a]
sequenceA [] = pure []
sequenceA (x:xs) = pure (:) <*> x <*> sequenceA xs
seqn :: Monad m => [m a] -> m [a]
并且是它的实现
seqn [] = return []
seqn (act:acts) = do x<- act
xs <- seqn acts
return (x:xs)
和 之间有什么关系和seqn
区别sequenceA
?
既然单子是一个应用程序,seqn
那么是否sequenceA
仅限于单子?
解决方案
从您添加的书(此处)的链接中,类型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
编辑:
为了回答评论中的问题, 我提出了一个新问题,以了解彼此之间的差异。希望它有所帮助: 证明 Applicative 和 Monad 的函数相等
总结
do
Haskell中没有应用程序的表示法,您可以在本段中专门阅读。这是一篇非常好的文章:Desugaring Haskell's do-Notation into Applicative Operations,它的主要思想是do
如果你想知道如何将 monads 的符号去糖化为应用程序。
return
并且pure
做同样的事情,但是有不同的约束,对吧?所以你可以看到这部分pure (:)
和这部分都被覆盖了。return (x:xs)
然后,在这里x <- act
你得到 的值act
,然后是 recursion 的值xs <- seqn acts
,最后用 return 包装它。
这pure (:) <*> x <*> sequenceA xs
就是本质上在做的事情。
推荐阅读
- excel - 如何从工作表中取出一行并逐行粘贴到另一个工作表上
- amazon-web-services - 在无服务器 yaml 配置中使用 fn::split 不起作用
- javascript - 使用Javascript中的类创建的对象中的方法在哪里
- javascript - Google Cloud Functions - Express js 和 Node JS 10 的入口点是什么?
- node.js - 需要安装 npm 2.15.5
- javascript - Google 身份验证请求 URL 中断(客户端身份验证)
- swiftui - 如何在 SwiftUI 中自动将值从一个视图发布到另一个视图?
- flutter - 表单必填文本字段(Mailer、Flutter)
- java - Nginx 限速与 org.apache.cxf.transport.servlet.CXFServlet 的关系
- mysql - 如何优化 SQL 查询结果以适应视图