【问题标题】:mapM putStrLn ["a", "b"] why does it show three lines?mapM putStrLn ["a", "b"] 为什么显示三行?
【发布时间】:2012-10-29 03:47:59
【问题描述】:
Prelude> mapM putStrLn ["a", "b"]
a
b
[(),()]
Prelude> mapM_ putStrLn ["a", "b"]
a
b

为什么第一个版本显示第三行而第二个不显示第三行来自哪里。没想到。

【问题讨论】:

    标签: haskell io monads


    【解决方案1】:

    如果你把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不费心打印()。
    猜你喜欢
    • 2014-03-29
    • 2010-12-08
    • 2011-05-30
    • 2015-09-14
    • 2021-10-06
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多