【问题标题】:do block with flower brackets in ghci throws error在 ghci 中用花括号阻止会引发错误
【发布时间】:2015-07-15 01:48:41
【问题描述】:

我有一个代码可以在 do block as 中使用 print,

do { print ([(n, 2^n) | n <- [0..19]]) }

然后我尝试了一个更简单的版本来打印变量值,

do { let a = 1; print (a) }

它抛出错误为parse error on input }

还有什么,我试过没有成功---

ghci> let a = 1; print (a)

ghci> :{
    |  let a = 1;
    |  print (a)
    |  :}

【问题讨论】:

    标签: haskell monads


    【解决方案1】:

    一旦您开始了let 语句,该行的其余部分将被视为附加的let 分配。请考虑以下错误消息:

    ghci> do print 1; let c = 2; d = 3
    <interactive>:3:13:
        The last statement in a 'do' block must be an expression
          let c = 2
              d = 3
    

    请注意,d = 3 不需要 let 关键字。

    要在 let 之后添加一元语句,您需要将其放在单独的行上(使用正确的缩进):

    ghci> :{
        | do print 1; let a = 2; b = 3
        |    print b
        | :}
    1
    3
    

    AFAIK,没有办法在同一行的 let 之后放置一元语句。

    【讨论】:

    • 您也可以通过将括号添加到let 将其放在同一行:do { let { a = 1 }; print a }
    • @DanielWagner 是的。 Haskell 中需要换行或缩进的 所有内容 都可以被视为适当放置 { ; } 字符的语法糖。 (支持反例)
    猜你喜欢
    • 2022-01-21
    • 2014-12-15
    • 2014-01-09
    • 2017-12-19
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2019-01-26
    • 2020-11-21
    相关资源
    最近更新 更多