let
- это ключевое слово макета, подобное do
, как в выражении в блоке do
, так и в выражении let
… in
…, поскольку оно вводит блок из привязок. Это:
main = do
a <- getLine
let b = "Hello " ++ a
putStrLn b
Desugars к этому:
main = do {
a <- getLine;
let {
b = "Hello " ++ a;
};
putStrLn b;
};
В то время как то, что вы написали, эквивалентно этому:
main = do {
a <- getLine;
let {
b = "Hello " ++ a;
putStrLn b
};
};
Поэтому, естественно, GHC ожидает чего-то другого - шаблона или =
- после putStrLn b
, поскольку вы могли бы определять локальную функцию с именем putStrLn
с параметром с именем b
. Решением является либо использование явных скобок в операторе let
:
main = do { a <- getLine; let { b = "Hello " ++ a }; putStrLn b }
Или использовать многострочный режим в GHCi либо командой :{
, завершенной командой :}
:
> :{
| main = do
| a <- getLine
| let b = "Hello " ++ a
| putStrLn b
| :}
>
Или с :set +m
и завершается пустой строкой:
> :set +m
| main = do
| a <- getLine
| let b = "Hello " ++ a
| putStrLn b
|
>
Затем следует :unset +m
для возврата в однострочный режим.