“associates to the right”是否等同于左结合或右结合?

3
如果我说一个操作是左结合的,是否等同于说它“从左到右关联”和“从右到左关联”?
我的疑惑来自于我在函数式编程Haskell教材中看到的一个例子。它声明:
函数应用从左到右关联。例如,mult x y z表示((mult x)y)z。即mult接收一个整数x,返回一个函数mult x,该函数接收一个整数y,并返回一个函数mult x y,该函数接收一个整数z并返回x*y*z的结果。
但是,如果我说它是“从左到右关联”,我会认为它是右结合的,即评估从右侧开始,向左侧进行。然而,由于mult的评估是从左侧开始,并且向右侧进行,所以这是左结合的吗?作者是否应该说函数应用程序“从右到左关联”?还是我漏掉了什么,作者是正确的?

4
或许术语有些奇怪,但在实际应用中已经很清晰:我们总是指虚拟括号所在的那一侧。 - leftaroundabout
它们应该意思相同,尽管我从未见过这个表达式的使用。它要么是左结合,要么是右结合。函数应用是左结合的:x y z v = (((x y) z) v)。你不能说应用程序是右结合的。 - white_wolf
然后它就变成了一个词语游戏。左结合和右结合非常容易理解,因为它们是关于分组运算符的,我认为使用相反的方向和“到”会让人感到困惑。 - white_wolf
2
优先级和求值顺序是不同的概念。 - chi
2
@Steve314,这本身就是一个好问题。我会这样表述:“左结合”和“右结合”是语法概念:它们只是意味着a @ b @ c应该被读作(a @ b) @ c或者a @ (b @ c)。然而,“结合”不仅仅是语法问题:它意味着(a @ b) @ c = a @ (b @ c),这确实是@所代表的任何东西的属性。也许我们可以说,具有结合性意味着同时具有左结合性和右结合性,但那会很令人困惑,并混淆在不同层次上工作的概念。 - duplode
显示剩余3条评论
1个回答

14

你只需要停止思考求值顺序。

括号实际上是关于表达式结构的,也就是说,当我们说mult x y时,我们指的是这些内容中的哪一个,而不是我们以后决定如何求值。

      $           $
     / \         / \
    $   y     mult  $
   / \             / \
mult  x           x   y

是的,我们在学校里学到括号是关于操作顺序的。这是因为我们是在算术运算符的背景下学习的。由于这些都是严格的,决定如何计算给定表达式的自由度较小,而括号大部分确定了一个顺序。此外,我们可能从未考虑过表达式作为抽象事物与书写方式不同的方面。

在更一般的 Haskell 上下文中,我们不能混淆解析和评估。当我们说某个东西“从左侧关联”或“向左侧关联”时,我们只是在谈论它的解析方式。它告诉你 x 属于一个子表达式,其左侧有 mult,而右侧没有 y

(我还没有看到有人使用“associates from”的短语,除非您将其解读为“associates away from”,否则这并没有太多意义。)


“左结合”是我母语捷克语中的表达方式。可以想象,将最高优先级部分周围的括号连续添加起来,从左到右将序列用括号包围起来,因此,在包装过程中,左侧已经被包装,右侧尚未被包装,但稍后将被包装。 - matj1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接