理解`sequence_`

Kev*_*ith 2 monads haskell

All About Monads解释说sequence_:

sequence_功能(注意下划线)具有相同的行为sequence,但不返回结果的列表.当只有monadic计算的副作用很重要时,它是有用的.

然后,看看TestSequence.hs:

import Control.Monad

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

run :: [String] -> IO ()
run xs = sequence_ . map f $ xs
Run Code Online (Sandbox Code Playgroud)

我可以运行它:

?: run ["foo", "bar"]
"foo"
"bar"
Run Code Online (Sandbox Code Playgroud)

sequence_呼吁unsafePerformIOIO ()得到的结果,即()

并且,sequence_气馁?或者,它是否IO Monad仅仅用于"在世界末日"运行一系列IO行动?

Dan*_*ner 11

不,它没有呼吁unsafePerformIO每一个IO ()行动.事实上,它的类型甚至不是特定的IO:

sequence_ :: (Monad m, Foldable t) => t (m a) -> m ()
Run Code Online (Sandbox Code Playgroud)

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

sequence_ [] = return ()
sequence_ (x:xs) = x >> sequence_ xs
Run Code Online (Sandbox Code Playgroud)

绝对不气馁; sequence_(以及它的大哥mapM_)非常有用,它甚至是我为什么Monad作为抽象有用的激励性例子之一.

  • 在任何情况下,这些都不能解释`Monad`抽象,因为即使`Applicative`对于这项工作也有点强. (2认同)