都是关于单子的解释sequence_
sequence_函数(注意下划线)具有与sequence相同的行为,但不返回结果列表。它是有用的,当只有副作用的一元计算是重要的。
然后,看看TestSequence.hs
import Control.Monad
f :: String -> IO ()
f x = print x
run :: [String] -> IO ()
run xs = sequence_ . map f $ xs我可以运行它:
λ: run ["foo", "bar"]
"foo"
"bar"sequence_是否在每个IO ()上调用unsafePerformIO以获得结果,即()
那么,sequence_是否气馁呢?或者,对于IO Monad来说,它只是使用“在世界末日”来运行IO操作的列表吗?
发布于 2015-10-26 03:41:48
不,它不是对每个unsafePerformIO操作调用IO ()。实际上,它的类型甚至不特定于IO。
sequence_ :: (Monad m, Foldable t) => t (m a) -> m ()在旧库中,当它特定于列表(而不是所有Foldable的泛型)时,它是以以下完全可读的方式实现的:
sequence_ [] = return ()
sequence_ (x:xs) = x >> sequence_ xs这是绝对没有气馁的;sequence_ (以及它的大哥mapM_)非常有用,以至于它甚至是我的激励示例之一,说明为什么Monad作为一种抽象是有用的。
https://stackoverflow.com/questions/33338097
复制相似问题