Подтвердить что ты не робот

Как использовать 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.

4b9b3361

Ответ 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| :}