Это потому, что f x
- это функция f
с первым параметром, который уже применяется, поэтому для получения результата требуется еще два. Это называется currying.
В Haskell на самом деле нет такой функции, как функция с тремя параметрами. a -> a -> a -> a
означает «Функция, которая принимает a
и возвращает функцию, которая принимает a
и возвращает функцию, которая принимает a
и возвращает a
».
Это много глотка, чтобы выписать, так что просто поставьте несколько парнеров, и он становится яснее: a -> (a -> (a -> a))
.
So f x
дает вам a -> (a -> a)
. Так получилось, что синтаксис Haskell позволяет вам сказатьи действовать так, как будто вы вызываете функцию с тремя параметрами и что компилятор достаточно умен, чтобы не создавать все эти промежуточные карри, если это не нужно.
Поскольку тип применения функции является '(а -> б) -> а -> b', а не' (а - > b) -> a -> (a -> b) '. – user2407038