在数学上,函数组合操作是关联的。因此:
f . (g . h) = (f . g) . h
因此,函数组合操作可以定义为左结合或右结合。
由于 Haskell 中的普通函数应用程序(即术语的并置,而不是$
操作)在我看来是左关联的,因此函数组合也应该是关联的。毕竟世界上大多数人(包括我自己)都习惯从左到右阅读。
不过 Haskell 中的函数组合是右结合的:
infixr 9 .
我知道函数组合操作是左关联还是右关联并没有真正的区别。不过,我很想知道为什么它没有留下联想。对于这个设计决策,我想到了两个原因:
- Haskell 的制造者希望函数组合在逻辑上与
$
操作相似。 - Haskell 的制造者之一是日本人,他发现将函数组合设为右关联而不是左关联更直观。
撇开玩笑不谈,函数组合在 Haskell 中正确关联是否有任何有益的理由?如果 Haskell 中的函数组合是关联的,会有什么不同吗?