从数学上讲,函数组合操作是结合的。因此:
f . (g . h) = (f . g) . h
因此,函数组合操作可以定义为左结合或右结合。由于在Haskell中的普通函数应用(即项的临近,而不是
$
操作),在我看来函数组合也应该是左结合的。毕竟,大多数人(包括我自己)习惯从左到右阅读。尽管如此,在Haskell中,函数组合是右结合的:
infixr 9 .
我知道函数复合运算符是左结合还是右结合并不真正有什么区别。但我很好奇为什么它不是左结合的。这个设计决策有两个原因:
- Haskell 的创作者希望函数复合在逻辑上与
$
操作类似。 - Haskell 的其中一位创作者是日本人,他认为把函数复合定义为右结合比左结合更加直观自然。
开玩笑的话先放一边,那么函数复合在 Haskell 中设置成右结合是否有任何有益的原因?如果 Haskell 中的函数复合是左结合的,会有什么不同吗?
$
操作符没有理由是右结合的。然而,右结合并不总是错误的。例如,++
操作符和逻辑操作符&&
和||
必须明显地是右结合的,以便连接成本最小化,并且逻辑表达式可以被短路。 - Aadit M Shah