4
Prelude> mapM putStrLn ["a", "b"]
a
b
[(),()]
Prelude> mapM_ putStrLn ["a", "b"]
a
b

为什么第一个版本显示第三行而第二个不显示第三行来自哪里。我没想到。

4

1 回答 1

17

如果您将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

于 2012-11-08T20:58:53.267 回答