Математически операция компоновки функций ассоциативна. Следовательно:
f . (g . h) = (f . g) . h
Таким образом, операция композиции функции может быть определена как левая ассоциативная, так и правая ассоциативная.
Так как приложение нормальной функции в Haskell (т.е. сопоставление терминов, а не операция $
) остается ассоциативным, то, по моему мнению, композиция функции также должна быть ассоциативной. Ведь большинство людей в мире (включая меня) используются для чтения слева направо.
Тем не менее состав функций в Haskell является правильным ассоциативным:
infixr 9 .
Я знаю, что на самом деле не имеет значения, оставлена ли ассоциация ассоциативной или правой ассоциативной. Тем не менее мне любопытно узнать, почему это не осталось ассоциативным. Мне приходят на ум две причины:
- Создатели Haskell хотели, чтобы функциональная композиция была логически подобна операции
$
. - Один из создателей Haskell был японцем, который счел более интуитивно понятным, чтобы композиция композиции была правильной ассоциативной, а не левой ассоциативной.
Шутки в сторону, есть ли какая-нибудь полезная причина, чтобы композиция функции была правильной ассоциативной в Haskell? Будет ли иметь значение, если состав функций в Haskell остался ассоциативным?