【发布时间】:2019-08-12 04:27:14
【问题描述】:
我对 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 的哪个晦涩的解析规则?
【问题讨论】:
-
我觉得this answer可以帮你理清Haskell的缩进规则。 (相关问题也和你的很相似。)
-
“换行符(此处存在)应该使分号多余”仅当您没有明确的大括号时!
标签: haskell switch-statement let