问题标签 [associativity]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 运算符关联性何时重要?
大多数编程语言都有一个二元运算符的优先级和关联性表。在某些情况下,关联性很重要,例如(a - b) - c
!= a - (b - c)
。
然而,对于像这样的关联运算符来说&&
,这似乎无关紧要,但大多数语言都将其列为左关联。
(a && b) && c
是否存在和之间实际上存在差异的情况a && (b && c)
?
c++ - 二元布尔运算符是否具有关联性?
是a && b && c
由语言定义的意思(a && b) && c
还是a && (b && c)
?
哇,杰瑞很快。加强这个问题:这真的重要吗?a && b && c
被解释为(a && b) && c
或之间会有明显的区别a && (b && c)
吗?
scala - 解析器组合器语法没有产生正确的关联性
我正在研究一个简单的表达式解析器,但是鉴于下面的解析器组合器声明,我似乎无法通过我的测试并且右关联树不断弹出。
我一直在为此调试几个小时。我希望有人能帮我弄清楚它不正确。
"5-4-3" 将产生一个计算结果为 4 而不是预期的 -2 的树。
上面的语法有什么问题?
parsing - 表达式解析器语法和左结合性
我一直在尝试为带有变量的表达式创建解析器并将它们简化为二次表达式形式。
这是我的解析器语法:
对于解析,我使用递归下降解析器。假设我想解析这个:
“ 2 - 1 + 1 = 0”
结果为 0,解析器创建错误的树:
我怎样才能使这个语法左结合?我是这方面的新手,请你告诉我在哪里可以找到更多信息的来源?我可以使用递归下降解析器来实现这一点吗?
haskell - 为什么 Haskell 中的函数组合是右结合的?
在数学上,函数组合操作是关联的。因此:
因此,函数组合操作可以定义为左结合或右结合。
由于 Haskell 中的普通函数应用程序(即术语的并置,而不是$
操作)在我看来是左关联的,因此函数组合也应该是关联的。毕竟世界上大多数人(包括我自己)都习惯从左到右阅读。
不过 Haskell 中的函数组合是右结合的:
我知道函数组合操作是左关联还是右关联并没有真正的区别。不过,我很想知道为什么它没有留下联想。对于这个设计决策,我想到了两个原因:
- Haskell 的制造者希望函数组合在逻辑上与
$
操作相似。 - Haskell 的制造者之一是日本人,他发现将函数组合设为右关联而不是左关联更直观。
撇开玩笑不谈,函数组合在 Haskell 中正确关联是否有任何有益的理由?如果 Haskell 中的函数组合是关联的,会有什么不同吗?
c++ - 修复表达式;运算符优先级
我正在阅读 C++ Primer, 5th Edition 来学习 C++,但是我遇到了一个我有点卡住的问题。问题如下:
由于运算符优先级,以下表达式无法计算。你会如何解决它?
我尝试了各种解决方案,但我似乎无法得到它。我的逻辑是相等运算符需要两个表达式,所以我需要创建它,但我的解决方案不起作用。非常感谢任何帮助!
php - 三元运算符左结合性
在 PHP 手册中,我在“操作员”下找到了以下“用户贡献说明”。
请注意,在 php 中,三元运算符 ?: 具有左关联性,这与在 C 和 C++ 中具有右关联性的情况不同。
您不能编写这样的代码(就像您在 C/C++ 中可能已经习惯的那样):
我实际上尝试了一下,它真的打印出来了four
。但是我无法理解其背后的原因,仍然觉得它应该打印two
或other
.
有人可以解释一下这里发生了什么以及为什么要打印“四”吗?
javascript - 为什么 JavaScript 中的逻辑运算符是左关联的?
逻辑 AND 和 OR 运算符是 JavaScript 中唯一的惰性运算符以及三元条件运算符。使用以下规则对它们进行短路评估测试:
这与在 Haskell 中实现的方式相同:
然而,根据 MDN,JavaScript 中的逻辑运算符是左关联的。这是反直觉的。在我看来,他们应该是正确的联想。Haskell 做了正确的事。Haskell 中的逻辑运算符是右结合的:
考虑 Haskell 中的以下表达式:
因为&&
在 Haskell 中是右结合的,所以上面的表达式等价于:
因此,表达式的结果并不重要(True && (True && True))
。因为第一个False
,整个表达式被简化为False
一步。
现在考虑如果&&
留下联想会发生什么。该表达式将等效于:
现在需要 3 次归约来评估整个表达式:
如您所见,逻辑运算符具有右关联性更有意义。这让我想到了我的实际问题:
为什么 JavaScript 中的逻辑运算符是左关联的?ECMAScript 规范对此有什么看法?JavaScript 中的逻辑运算符实际上是右关联的吗?MDN 文档是否有关于逻辑运算符关联性的错误信息?
编辑:根据规范,逻辑运算符是左关联的:
c++ - 谁定义了 C 运算符优先级和关联性?
介绍
在每本关于 C/C++ 的教科书中,您都会找到一个运算符优先级和关联性表,如下所示:
http://en.cppreference.com/w/cpp/language/operator_precedence
StackOverflow 上的一个问题是这样的:
以下函数执行的顺序是什么:
f1() * f2() + f3();
f1() + f2() * f3();
参考前面的图表,我自信地回答说函数具有从左到右的关联性,因此在前面的语句中,在两种情况下都像这样评估:
f1() -> f2() -> f3()
评估功能后,您可以像这样完成评估:
(a1 * a2) + a3
a1 + (a2 * a3)
令我惊讶的是,很多人告诉我我完全错了。决心证明他们错了,我决定转向 ANSI C11 标准。我再次惊讶地发现,很少有人提到运算符优先级和关联性。
问题
- 如果我认为函数总是从左到右进行评估的信念是错误的,那么表中提到函数优先级和关联性的真正含义是什么?
- 如果不是 ANSI,谁来定义运算符优先级和关联性?如果是ANSI做出定义,为什么很少提及运算符优先级和关联性?运算符优先级和关联性是从 ANSI C 标准推断出来的,还是在数学中定义的?
language-agnostic - 非二元函数的关联、交换性质和单位元
我正在制作一个编译器(用于一种新语言),它通过模式匹配支持 AC 统一。匹配算法已经有效,但是我在函数的逻辑和数学方面以及它的属性方面遇到了麻烦,这将以很好的方式定义语言的设计。我有几个关于函数属性的问题:
关联和交换属性仅适用于二元函数?
例如,如果我声明一个函数 max(a,b),这将是可交换的,因为 max(a,b) = max(b,a) 并且是关联的,因为 max(a,max(b,c)) = max(max (a,b),c),但我想不出任何具有两个以上满足该公理的参数的函数。例如,我可以定义 max(a,b,c) = max(a,max(b,c)) 这将是一个三元函数,但该语言将能够将它与符合它的二进制操作统一起来。
统一通过将诸如 max(a,max(b,c)) 之类的关联函数简化为可变和规范形式 max(a,b,c) 然后在此规范形式上执行模式匹配,所以所有(我认为) 具有超过 3 个参数的此属性的可能函数实际上是相同二元函数的复合
标识元素是否仅适用于二元函数?
解释:可以有一个可变函数 f(a,b,...)(超过 2 个参数),使得存在满足 f(a,b,c,e) = f(a,b,c) 的元素 e ) 对于没有直接二进制父级的函数(例如加法是二进制的,但编译器将加法管理为内部表示的可变函数)
诸如零之类的统一元素仅在语言中通过删除其对函数的 aparences 进行管理,例如 add(1,2,x,0) ,它表示表达式 1+2+x+0 减少为 1+2+x
这些问题对于在定义规则(例如 a+b = b+a)时自动识别函数的此属性的算法设计以及语言设计和将强加于函数声明的约束(可以是,如果这些问题中的任何一个为假,则不合逻辑