【发布时间】:2012-10-29 03:47:59
【问题描述】:
Prelude> mapM putStrLn ["a", "b"]
a
b
[(),()]
Prelude> mapM_ putStrLn ["a", "b"]
a
b
为什么第一个版本显示第三行而第二个不显示第三行来自哪里。没想到。
【问题讨论】:
Prelude> mapM putStrLn ["a", "b"]
a
b
[(),()]
Prelude> mapM_ putStrLn ["a", "b"]
a
b
为什么第一个版本显示第三行而第二个不显示第三行来自哪里。没想到。
【问题讨论】:
如果你把mapM 版本放在一个独立程序中,用ghc 编译它,然后运行它,你也不会得到第三行:
$ cat demo.hs
main = mapM putStrLn [ "a", "b" ]
$ ghc demo.hs
$ ./demo
a
b
$
您在ghci 中看到的[(),()] 只是mapM 调用的返回值; ghci 自动显示您输入的每个表达式的值。 (这就是为什么 ghci 被称为读取-评估-打印循环或 REPL;“打印”部分就是您在此处看到的。)
虽然mapM 创建了一个列表,其中包含每个putStrLn 调用的返回值(因此您会为列表中的每个元素获得一个()),mapM_ 丢弃这些返回值并返回IO (),它ghci 懒得显示。因此,在这种情况下,您不会看到来自 ghci 的额外行。
【讨论】: