数学的には、関数合成操作は連想的です。したがって:
f . (g . h) = (f . g) . h
したがって、関数合成操作は、左結合または右結合のいずれかとして定義できます。
私の意見では、Haskell での通常の関数の適用 (つまり、$
操作ではなく用語の並置) は連想のままなので、関数の合成も連想のままにしておく必要があります。結局、世界のほとんどの人 (私を含む) は、左から右に読むことに慣れています。
それにもかかわらず、Haskell の関数合成は右結合です。
infixr 9 .
関数合成操作が左結合であるか右結合であるかは、実際には違いがないことを私は知っています。それにもかかわらず、なぜ連想のままにされないのか知りたいです。この設計上の決定について、次の 2 つの理由が頭に浮かびます。
- Haskell の作成者は、関数合成が演算と同じくらい論理的に似ていることを望んでいました
$
。 - Haskell の作成者の 1 人は、関数合成を左結合ではなく右結合にする方が直感的であることに気付いた日本人でした。
冗談はさておき、関数合成が Haskell で右結合的であるという有益な理由はありますか? Haskell の関数合成を連想のままにしておくと、何か違いはありますか?