当模式匹配时,括号在(x:xs)中表示什么?

Pra*_*eep 26 syntax haskell

当您使用x:xs语法拆分列表时,为什么它包含在括号中?圆括号的意义是什么?为什么不是[x:xs]或只是x:xs?

Nor*_*sey 45

cons单元格不必在每个上下文中都有括号,但在大多数情况下都是因为

函数应用程序比任何中缀运算符都更紧密.

用火信将它烧成大脑.

例:

length [] = 0
length (x:xs) = 1 + length xs
Run Code Online (Sandbox Code Playgroud)

如果省略括号,编译器会认为你有一个参数x后跟一个错误放置的中缀运算符,它会痛苦地抱怨.另一方面,这没关系

length l = case l of [] -> 0
                     x:xs -> 1 + length xs
Run Code Online (Sandbox Code Playgroud)

在这种情况下,既不xxs不可能被解释为功能应用程序的一部分,因此不需要括号.

请注意,相同的精彩规则函数应用程序比任何中缀运算符更紧密,这使我们可以length xs1 + length xs没有任何括号的情况下写入.中缀规则赋予和中缀规则取消.

  • 火灾信件+1.在我内化了这条规则之后,我的Haskell代码停止了看起来像Lisp. (2认同)

syk*_*ora 14

您只是使用:优先级较低的cons运算符.需要括号以使事情保持正确.

并且您不使用[x:xs],因为这将匹配列表,其唯一的元素是具有头部x和尾部的列表xs.