Prelude> mapM putStrLn ["a", "b"]
a
b
[(),()]
Prelude> mapM_ putStrLn ["a", "b"]
a
b
Run Code Online (Sandbox Code Playgroud)
为什么第一个版本显示第三行而第二个版本不显示,第三行来自何处.我不指望它.
Mar*_*eed 17
如果你把这个mapM版本放在一个独立的程序中,用它编译ghc,然后运行它,你就不会得到它的第三行:
$ cat demo.hs
main = mapM putStrLn [ "a", "b" ]
$ ghc demo.hs
$ ./demo
a
b
$
Run Code Online (Sandbox Code Playgroud)
那[(),()]你看到ghci只是返回值mapM调用; ghci自动显示您输入的每个表达式的值.(这就是为什么ghci称为读取 - 评估 - 打印循环,或REPL;"打印"部分就是您在这里看到的.)
虽然mapM创建包含每一个的返回值的列表putStrLn调用(所以你得到一个()列表中的每个元素), mapM_丢弃那些返回值和回报IO (),这ghci不打扰显示.所以ghci在这种情况下你没有看到额外的一行.