Как использовать let в блоке do в ghci?
Я пытаюсь создать блок do интерактивно в ghci. Пока я не определяю переменную с блоком, это прекрасно:
Prelude>let a = do putStrLn "test"; putStrLn "other test"
Prelude>
но я не могу понять, как определить конструкцию let в блоке do в интерактивном режиме, не получив ошибку синтаксического анализа:
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.
Ответы
Ответ 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| :}