mapM putStrLn [“a”,“b”]为什么它显示三行?

时间:2012-11-08 20:56:20

标签: haskell io monads

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

为什么第一个版本显示第三行而第二个版本不显示,第三行来自何处​​。我不指望它。

1 个答案:

答案 0 :(得分: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的额外行。