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