我正在尝试以交互方式在ghci中创建一个do块。只要我没有在块中定义变量,就可以了:
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。
答案 0 :(得分:15)
试试这个:
let a = do let { b = 5 } ; print b
let
块可以包含多个声明,因此您必须告知GHCi何时完成 - 这是该行中括号的含义。
顺便说一下,您可以print
使用putStrLn . show
。
答案 1 :(得分:12)
: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| :}
小心布局(缩进/空格)。否则,您可以在明显正确的代码中获得解析错误。
例如,以下 NOT 工作,因为缩进不够深:
Prelude> :{
Prelude| let a = do
Prelude| let b=5
Prelude| putStrLn $ show b
Prelude|
Prelude| :}
这会导致像这样的解析错误:
<interactive>:50:4: parse error on input ‘let’
答案 2 :(得分:1)
我原本以为把括号括起来会很好,但这不解析:
ghci> let a = do {let b = 5; putStrLn (show b)}
你总是可以采用多线方法,它确实有效:
ghci> :{
ghci| let a = do let b = 5
ghci| putStrLn $ show b
ghci| :}
答案 3 :(得分:1)
我登陆这里是因为我有同样的问题,但是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)