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
看到额外的行。