Как можно (<$>) оставить ассоциативным

Я только заметил, что (<$>) имеет фиксированность infixl 4. Как это может быть?

(+1) <$> (/5) <$> [5,10], очевидно, работает справа налево.

Ответы

Ответ 1

Нет, <$> остается ассоциативным, и в вашем примере это не так. (+1) <$> (/5) <$> [5,10] читается как ((+1) <$> (/5)) <$> [5,10]. Это происходит из-за экземпляра Functor (->) a в основном эквивалентно составу функции; fmap (+1) (/5) эквивалентен \x -> (x/5)+1, который в этом случае дает вам тот же результат, что и вы, с тем, как вы думаете, что это работает, т.е. (+1) <$> ((+5) <$> [5,10]).

Так как это немного запутанно, если вы хотите применить несколько функций в строке, то, вероятно, лучше для чтения использовать обычный оператор композиции функций: (+1) . (/5) <$> [5,10].