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

Tne*_*ppa 12 haskell ghci

我正在尝试以交互方式在ghci中创建一个do块.只要我没有在块中定义变量,就可以了:

Prelude>let a = do putStrLn "test"; putStrLn "other test"
Prelude>
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何在交互式地在do块中定义let构造而不会出现解析错误:

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

<interactive>:2:40:
    parse error (possibly incorrect indentation or mismatched brackets)
Run Code Online (Sandbox Code Playgroud)

明显

let a = do
     let b = 5
     putStrLn $ show b
Run Code Online (Sandbox Code Playgroud)

在Haskell源文件中完全没问题.我只是在弄清楚如何将其翻译成ghci.

yat*_*975 15

试试这个:

let a = do let { b = 5 } ; print b 
Run Code Online (Sandbox Code Playgroud)

let块可以包含多个声明,因此您必须告知GHCi何时完成 - 这就是此行中括号的含义.

顺便说一句,你可以使用printputStrLn . show.


one*_*uth 12

:help

 <statement>                 evaluate/run <statement>    
:{\n ..lines.. \n:}\n        multiline command
Run Code Online (Sandbox Code Playgroud)

您可以键入:{以启动多行命令,并键入:}以结束它.

所以就这么做

 Prelude> :{
 Prelude| let a = do
 Prelude|     let b=5
 Prelude|     putStrLn $ show b
 Prelude| 
 Prelude| :} 
Run Code Online (Sandbox Code Playgroud)

小心布局(缩进/空格).否则,您可以在显然正确的代码中获得解析错误.

例如,以下将工作,因为压痕不够深入:

Prelude> :{
Prelude| let a = do
Prelude|    let b=5
Prelude|    putStrLn $ show b
Prelude| 
Prelude| :}
Run Code Online (Sandbox Code Playgroud)

它会导致像这样的解析错误:

<interactive>:50:4: parse error on input ‘let’
Run Code Online (Sandbox Code Playgroud)