【问题标题】:How do I use a let within a do block in ghci?如何在 ghci 的 do 块中使用 let?
【发布时间】:2013-03-07 14:02:34
【问题描述】:

我正在尝试在 ghci 中以交互方式创建一个 do 块。只要我不使用 in 块定义变量就可以了:

Prelude>let a = do putStrLn "test"; putStrLn "other test"
Prelude>

但我不知道如何在 do 块中以交互方式定义 let 构造而不会出现解析错误:

Prelude> let a = do let b = 5; putStrLn $ show b

<interactive>:2:40:
    parse error (possibly incorrect indentation or mismatched brackets)

显然

let a = do
     let b = 5
     putStrLn $ show b

在 Haskell 源文件中完全没问题。我只是无法弄清楚如何将其转换为 ghci。

【问题讨论】:

    标签: haskell ghci


    【解决方案1】:

    试试这个:

    let a = do let { b = 5 } ; print b 
    

    let 块可以包含多个声明,因此您必须在它们完成时告诉 GHCi - 这就是该行中括号的含义。

    顺便说一句,你可以用print代替putStrLn . show

    【讨论】:

      【解决方案2】:
      :help
      
       <statement>                 evaluate/run <statement>    
      :{\n ..lines.. \n:}\n        multiline command
      

      您可以输入 :{ 来启动多行命令,然后输入 :} 来结束它。

      那就这样吧

       Prelude> :{
       Prelude| let a = do
       Prelude|     let b=5
       Prelude|     putStrLn $ show b
       Prelude| 
       Prelude| :} 
      

      注意布局(缩进/空白)。否则,您可能会在明显正确的代码中出现解析错误。

      例如,以下将工作,因为缩进不够深:

      Prelude> :{
      Prelude| let a = do
      Prelude|    let b=5
      Prelude|    putStrLn $ show b
      Prelude| 
      Prelude| :}
      

      会导致这样的解析错误:

      <interactive>:50:4: parse error on input ‘let’
      

      【讨论】:

        【解决方案3】:

        我原以为放入大括号就可以了,但这并不能解析:

        ghci> let a = do {let b = 5; putStrLn (show b)}
        

        您始终可以采用多行方法,它确实有效:

        ghci> :{
        ghci| let a = do let b = 5
        ghci|            putStrLn $ show b
        ghci| :} 
        

        【讨论】:

        • @ДМИТРИЙМАЛИКОВ 是的,我不是说它有效!我进行了编辑以发表评论,大意是我知道原始答案不起作用,而我正在将答案更改为确实起作用的东西!在发布答案之前应该尝试在 GHCI 中运行它:)
        • 你没有放足够的牙套。
        • @augustss 这是什么,Java?
        【解决方案4】:

        我来到这里是因为我有同样的问题,但是 yatima2975 的回答让我想起了每个 let-block 是如何有多个绑定的,所以我尝试了以下方法,确实有效。

        $ ghci
        GHCi, version 8.8.3: https://www.haskell.org/ghc/  :? for help
        Prelude> do { let { x = 1; y = 2 }; putStrLn (show (x, y)) }
        (1,2)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-29
          • 2017-04-17
          • 2016-10-12
          • 2017-03-31
          • 2015-05-11
          • 1970-01-01
          • 2019-10-20
          • 2021-10-22
          相关资源
          最近更新 更多