4
Prelude> mapM putStrLn ["a", "b"]
a
b
[(),()]
Prelude> mapM_ putStrLn ["a", "b"]
a
b
爲什麼第一個版本顯示第三行,第二個版本顯示不了第三行,第三行來自哪裏。我不會期望它。mapM putStrLn [「a」,「b」]爲什麼顯示三行?
Prelude> mapM putStrLn ["a", "b"]
a
b
[(),()]
Prelude> mapM_ putStrLn ["a", "b"]
a
b
爲什麼第一個版本顯示第三行,第二個版本顯示不了第三行,第三行來自哪裏。我不會期望它。mapM putStrLn [「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
的多餘行。
實際上,mapM_返回IO(),但ghci不打印()。 – augustss
謝謝,更正。 –