0

来自Learn You a Haskell:

想想这个列表:[5]。这只是5:[]. 在 的左侧:,有一个值;在右侧,有一个列表。在这种情况下,它是一个空列表。现在名单怎么样[4,5]?好吧,这对4:(5:[]). 查看第一个 :,我们看到它的左侧还有一个元素,右侧还有一个列表 , (5:[])类似的列表也是如此3:(4:(5:6:[])),它可以写成这样或类似3:4:5:6:[](因为:是右关联的)或[3,4,5,6].

对于粗体部分,我期待不断增长的列表最终以3:(4:(5:(6:[]))). 这与我对柯里化、关联性或两者缺乏理解有关。有人能告诉我我的想法的缺陷吗?

4

3 回答 3

4

乘法是关联的。这意味着(x * y) * z与 相同x * (y * z)。但是,:不是关联的。

然而,术语“左结合”和“右结合”是不同的,并且与术语“结合”无关。

  • 如果*是左结合,则x * y * z与 相同(x * y) * z。括号是多余的。

  • 如果*是右结合,则x * y * z与 相同x * (y * z)。括号是多余的。

柯里化与此无关。

由于:是右结合的,[3,4,5,6]可以写成:

3:(4:(5:(6:[])))
3:4:(5:(6:[]))
3:(4:5:(6:[]))
3:4:5:(6:[])
3:(4:(5:6:[]))
3:4:(5:6:[])
3:(4:5:6:[])
3:4:5:6:[]
于 2012-11-30T02:21:53.900 回答
1

这只是一个错字。示例中应该有一个括号(但由于关联性,它是没有括号的相同行为)。

于 2012-11-30T02:32:52.340 回答
1
  1. 你说“我期待不断增长的名单最终达到高潮3:(4:(5:(6:[])))”。

    确实你是对的。如果你想消除所有的语法糖[3,4,5,6],你会得到3:(4:(5:(6:[])))

  2. 正如您在问题的评论中所说的“这本书说3:(4:(5:6:[]))”,您对此感到困惑。

    再说一次,你是对的。为了保持演示的统一,不应该这样做;这可能是一个错字。

就 Haskell 语法和语义而言,写作 3:(4:(5:6:[]))而不是3:(4:(5:(6:[]))). 这归结为是否5:6:[]相同的问题5:(6:[])。根据右结合性的定义,它是。因为:是右联想x:y:z= x:(y:z)

只是在这里添加一个令人讨厌的注释:通过利用:' 的右关联性(即不使用括号),可以3:(4:(5:(6:[])))非常简洁地编写:3:4:5:6:[]. 这仅比其语法糖长的单个字符[3,4,5,6]

另请参阅:http ://en.wikipedia.org/wiki/Operator_associativity以获取有关关联性的更多信息。

于 2012-11-30T02:38:04.963 回答