为什么在此表达式中冒号权利具有关联性?

时间:2018-07-18 00:50:40

标签: haskell brackets

因为我希望函数应用程序在Haskell中具有关联性

'x':'y':"z"

等效于('x':'y'):"z"('x':'y')是一个错误,因为'y'并非应有的列表。

但是'x':'y':"z"的计算结果类似于"xyz"的{​​{1}}。因此,隐式括号在这里是正确的关联。我们怎么解释呢?

2 个答案:

答案 0 :(得分:8)

它是declared in GHC.Types(由Prelude使用)

infixr 5 :

这被称为fixity declaration

答案 1 :(得分:1)

luqui的答案很严格。如果您对清单的定义方式有更深入的了解,您会发现它反之亦然:

Prelude> :info []
data [] a = [] | a : [a]

所以列表是

  1. “空列表”
  2. “元素,冒号(列表)和列表”

那是一个列表,没有别的就是列表,所以:

 []   -- Is a list -> by condition 1
 1    -- Is not a list

 1:[] -- Is a list by condition 2 -> an element, a colon, a list (empty)
 1:2  -- Is not a list. does not follow any condition -> an element, a colon, an element

 1:(2:[])  -- Is a list by condition 2 -> an element, a colon, a list (2:[])
 (1:[]):[] -- Is NOT a list -> a list (1:[]), a colon, a list
 (1:2):[]  -- Is not a list -> (1:2) is not an element

 [1,2,3,4] -- Is syntactic sugar for 1:(2:(3:(4:[])))

因此,如果将:保留为关联性,那么我们将得出(1:2):[]的情况,根据定义这不是一个列表。

希望有帮助