GHCI中的Haskell:为什么我需要parens来使这种模式匹配工作?

spa*_*e78 3 haskell pattern-matching

所以使用GHCI,这些语句对我来说是等价的,因为end0中的列表表达式是end1中列表表达式的语法糖:

let end0 [x,y,z] = z

let end1 (x:y:z:[]) = z
Run Code Online (Sandbox Code Playgroud)

但是从end1的模式中取出parens会给我一个"模式中的Parse错误"错误.那为什么呢?parens在模式匹配中是否具有特殊含义,或者它是一个优先级问题,就像我通常认为当我使用parens与运算符时一样?

rap*_*ria 7

它与优先权有关.

函数优先于:,因此GHC会推断您只为x定义函数.这就是为什么你必须将它全部包装在parens中.

  • 功能应用程序优先于*所有* (3认同)
  • 好吧,除了记录更新......人们通常假装这不是真的. (2认同)

Wei*_* Hu 6

因为没有parens,它被解析为let (end1 x):y:z:[] = z.