输出`sequence`功能

时间:2014-06-13 02:30:32

标签: haskell

Learn You a Haskell讨论带有IO的sequence函数。

ghci> sequence (map print [1,2,3,4,5])  
1  
2  
3  
4  
5  
[(),(),(),(),()] 

这本书讨论了:

  

最后的[(),(),(),(),()]是什么?好吧,当我们评估一个   GHCI中的I / O操作,它已执行,然后打印出结果,   除非结果是(),在这种情况下它不打印出来。

我不完全理解为什么结果是[(),...,()]。根据这句话,unless that result is (), in which case it's not printed out.

然而1..5打印出来,为什么()会被退回?

2 个答案:

答案 0 :(得分:1)

sequence (map print [1..5])的结果是[(), (), (), (), ()],而不是()

如果您使用结果为sequence_ (map print [1..5])的{​​{1}},则不会在GHCi中看到其结果。

答案 1 :(得分:1)

我认为你感到困惑,因为ghci会愉快地打印出任何IO a的值,其中a不是(),例如:

Prelude> import System.Time
Prelude System.Time> let x = getClockTime
Prelude System.Time> x
Fri Jun 13 16:53:34 EDT 2014

但是这不是在ghci之外运行代码时的行为,除非你后来写道:

x >>= print

只需按照类型进行操作即可看到运行序列的结果为您提供了IO [()]类型的值(ghci会很乐意打印,因为它不是类型IO ()

ghci> :t sequence
sequence :: Monad m => [m a] -> m [a]

ghci> :t sequence_
sequence_ :: Monad m => [m a] -> m ()

ghci> :t mapM_ print
mapM_ print :: Show a => [a] -> IO ()

所以你可以这样做:

ghci> sequence_ (map print [1..5])
1
2
3
4
5
ghci> mapM_ print [1..5]
1
2
3
4
5