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
打印出来,为什么()
会被退回?
答案 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