Haskell 为什么在这个表达式中冒号是右关联的?
因为函数应用程序在Haskell中是左关联的,所以我希望Haskell 为什么在这个表达式中冒号是右关联的?,haskell,brackets,Haskell,Brackets,因为函数应用程序在Haskell中是左关联的,所以我希望 'x':'y':"z" 等同于('x':'y'):“z”。 ('x':'y')是一个错误,因为'y'不是一个应该是的列表 但是'x':'y':“z”的计算结果与'x':('y':“z”)类似。所以隐式括号在这里是正确的。我们如何解释这一点呢?它是(由前奏曲使用) 这被称为a。luqui的anwser是第三个。如果你深入思考列表是如何定义的,你会意识到它不可能是另一种方式: Prelude> :info [] data [] a =
'x':'y':"z"
等同于('x':'y'):“z”
。
('x':'y')
是一个错误,因为'y'
不是一个应该是的列表
但是'x':'y':“z”
的计算结果与'x':('y':“z”)
类似。所以隐式括号在这里是正确的。我们如何解释这一点呢?它是(由前奏曲使用)
这被称为a。luqui的anwser是第三个。如果你深入思考列表是如何定义的,你会意识到它不可能是另一种方式:
Prelude> :info []
data [] a = [] | a : [a]
因此,列表是
“空列表”
元素、冒号(cons)和列表
这是一个列表,其他什么都不是列表,所以:
[] -- 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):[]
结束,这不是一个定义列表
希望对您有所帮助这是中缀运算符的应用程序(:)
,它被定义为右关联x:xs
与fx
不同。您可以使用中缀声明自定义运算符的固定性。内置运算符的优先级和关联性,以及声明自定义固定性的方法都很详细,谢谢,这已经提供了很多信息。我认为这个答案不正确。固定性与数据类型定义无关,您展示的示例具有误导性。当然,这可能是另一种方式:如果用infixl5:
定义它呢?正如我所说,正确的答案是luqui的答案<代码>:
是右关联的,因为它被定义为右关联。我的回答的重点是证明原因:如果定义infixl 5:,那么这个表达式将无法编译1:2:3:[]
,您需要添加显式括号1:(2:[])
。另一个例子是,如果您尝试将一个列表与至少两个元素进行模式匹配,您将得到以下代码f(x1:x2:xs))
。这比当前的f(x1:x2:xs)
可读性差。当然,您可以定义infixl5:
,但这将是一个糟糕的设计决策,因为数据是如何定义的。希望有帮助;)是的,但是说这是一个设计决定不同于说“它不可能是另一种方式”,这就是你在回答中所说的。您的回答使它看起来像是:
操作符的工作方式与数据声明中的工作方式一样:需要指出的是,它本可以以另一种方式工作,但选择正确的关联性只是因为它允许更少的括号。事实上,如果仅使用数据声明,则会选择默认的关联性,即infixl9
。
[] -- 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:[])))