Я запутался в правилах синтаксического анализа Haskell.
Это работает красиво:
n = 5
m = 6
b = case (n, m) of
(5, 6) -> True
_ -> False
main = print b
Давайте усложним это только крошечным кусочком, давайте добавим let
к смеси:
b =
let res = case (n, m) of
(5, 6) -> True
_ -> False
in not res
(Обратите внимание, для краткости я опускаю определения n
, m
и main
, теперь они продолжаются; я только изменяю b
)
Упс, проблемы здесь:
wtf.hs:5:5: error: parse error on input ‘(’
Failed, modules loaded: none.
Не знаю, может быть, это какое-то странное правило отступа, которого я не получаю. Хорошо, давайте поставим явные скобки:
b =
let res = case (n, m) of {
(5, 6) -> True
_ -> False }
in not res
Все еще нет?!
wtf.hs:6:7: error: parse error on input ‘->’
Failed, modules loaded: none.
Я полностью сбит с толку. Я не знаю что делать Почему это не работает? Давайте добавим здесь явную точку с запятой, хотя это, честно говоря, слепой выстрел, и хотя я не понимаю, зачем это здесь нужно, потому что, в конце концов, AFAIK, новая строка (которая присутствует здесь) должна делать точки с запятой избыточными:
b =
let res = case (n, m) of {
(5, 6) -> True;
_ -> False }
in not res
И это наконец работает!
... не знаю, возможно, проблема в том, что let
и case
находятся на одной линии. В качестве последней попытки исследовать это самостоятельно, давайте попробуем это:
b =
let res =
case (n, m) of
(5, 6) -> True
_ -> False
in not res
Это, однако, не сработает по загадочным для меня причинам:
wtf.hs:5:5: error:
parse error (possibly incorrect indentation or mismatched brackets)
Failed, modules loaded: none.
Серьезно, я запутался здесь. Почему здесь нужны явные скобки и точки с запятой? (А они? Можно ли отформатировать код таким образом, чтобы он не был нужен?)
Какое неясное правило синтаксического анализа Haskell я не получу здесь?