Как уже упоминалось ранее, Haskell поддерживает композицию функций следующим образом:
(i . h . g . f) x
, что эквивалентно: i(h(g(f(x))))
Это стандартный порядок операций для композиции функций в математике. Однако некоторые люди все еще считают это отсталым. Не вдаваясь в споры о том, какой подход лучше, я хотел бы отметить, что вы можете легко определить перевернутый оператор композиции:
infixr 1 >>>, <<<
(<<<) = (.) -- regular function composition
(>>>) = flip (.) -- flipped function composition
(f >>> g >>> h >>> i) x
-- or --
(i <<< h <<< g <<< f) x
Это обозначение, используемое стандартной библиотекой Control.Category . (Хотя фактическая сигнатура типа обобщена и работает на другие вещи, кроме функций). Если вас все еще беспокоит то, что параметр находится в конце, вы также можете использовать вариант оператора приложения функции:
infixr 0 $
infixl 0 #
f $ x = f x -- regular function application
(%) = flip ($) -- flipped function application
i $ h $ g $ f $ x
-- or --
x % f % g % h % i
Что близко к синтаксису, который вы хотите. Насколько мне известно, %
НЕ является встроенным оператором в Haskell, но $
есть. Я замутил инфиксные биты. Если вам интересно, это техническая составляющая, которая делает приведенный выше код следующим:
(((x % f) % g) % h) % i -- intended
а не:
x % (f % (g % (h % i))) -- parse error (which then leads to type error)