为什么 mapM putStrLn ["a", "b"] 会显示三行?

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

为什么第一个版本会显示第三行,而第二个版本却没有,第三行是从哪里来的。我没想到会出现这种情况。
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看到额外的行。


7
mapM_ 实际上返回的是 IO (),但 ghci 不会打印出 ()。 - augustss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接