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 =

因为函数应用程序在Haskell中是左关联的,所以我希望

'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:[])))