首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解`sequence_`

理解`sequence_`
EN

Stack Overflow用户
提问于 2015-10-26 03:36:51
回答 1查看 1.9K关注 0票数 4

都是关于单子的解释sequence_

sequence_函数(注意下划线)具有与sequence相同的行为,但不返回结果列表。它是有用的,当只有副作用的一元计算是重要的。

然后,看看TestSequence.hs

代码语言:javascript
复制
import Control.Monad

f :: String -> IO ()
f x = print x

run :: [String] -> IO ()
run xs = sequence_ . map f $ xs

我可以运行它:

代码语言:javascript
复制
λ: run ["foo", "bar"]
"foo"
"bar"

sequence_是否在每个IO ()上调用unsafePerformIO以获得结果,即()

那么,sequence_是否气馁呢?或者,对于IO Monad来说,它只是使用“在世界末日”来运行IO操作的列表吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-26 03:41:48

不,它不是对每个unsafePerformIO操作调用IO ()。实际上,它的类型甚至不特定于IO

代码语言:javascript
复制
sequence_ :: (Monad m, Foldable t) => t (m a) -> m ()

在旧库中,当它特定于列表(而不是所有Foldable的泛型)时,它是以以下完全可读的方式实现的:

代码语言:javascript
复制
sequence_ [] = return ()
sequence_ (x:xs) = x >> sequence_ xs

这是绝对没有气馁的;sequence_ (以及它的大哥mapM_)非常有用,以至于它甚至是我的激励示例之一,说明为什么Monad作为一种抽象是有用的。

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

https://stackoverflow.com/questions/33338097

复制
相关文章

相似问题

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