Haskell 如何在ghci中的do块内使用let?

Haskell 如何在ghci中的do块内使用let?,haskell,ghci,Haskell,Ghci,我试图在ghci中以交互方式创建do块。只要我不使用in block定义变量,就可以: 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

我试图在ghci中以交互方式创建do块。只要我不使用in block定义变量,就可以:

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)

在Haskell源文件中完全没有问题。我只是不知道如何将其转换为ghci。

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

ghci> let a = do {let b = 5; putStrLn (show b)}
您可以始终采用多行方法,该方法确实有效:

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

let a = do let { b = 5 } ; print b 
let
块可以包含多个声明,因此您必须在声明完成时告诉GHCi-这就是这一行中括号的作用

顺便说一下,您可以使用
print
for
putStrLn。显示

: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| :}
这将导致如下解析错误:

<interactive>:50:4: parse error on input ‘let’
:50:4:输入“let”时分析错误

我来到这里是因为我有同样的问题,但是yatima2975的回答提醒了我每个let块可以有多个绑定,所以我尝试了下面的方法,它确实有效

$ 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)

@是的,我不是说它有效!我编辑后留下了一条评论,大意是我知道原来的答案不管用,而我正在把答案改成管用的东西!在发布答案之前,应该在GHCI中运行它:)你没有放足够的大括号。@augustss这是什么,Java?
<interactive>:50:4: parse error on input ‘let’
$ 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)