Я понимаю основы композиции функций в F #, как, например, описано здесь.
Возможно, я что-то упускаю. Операторы >>
и <<
, похоже, были определены с предположением, что каждая функция принимает только один аргумент:
> (>>);;
val it : (('a -> 'b) -> ('b -> 'c) -> 'a -> 'c) = <fun:it@214-13>
> (<<);;
val it : (('a -> 'b) -> ('c -> 'a) -> 'c -> 'b) = <fun:it@215-14>
Однако я хотел бы сделать что-то вроде следующего:
let add a b = a + b
let double c = 2*c
let addAndDouble = add >> double // bad!
Но даже несмотря на то, что вывод add
относится к типу, необходимому для ввода double
, он отклоняется.
Я знаю, что могу переписать add с одним аргументом кортежа:
let add (a,b) = a + b
Или я могу написать новый оператор для каждого количества возможных аргументов первой функции:
let inline (>>+) f g x y = g (f x y)
let doubleAdd = add >>+ double
Но это кажется глупым! Есть ли лучший способ, который я пропустил?