我了解 F# 中函数组合的基础知识,例如,此处所述。
不过,也许我错过了一些东西。>>
and<<
运算符似乎是在假设每个函数只接受一个参数的情况下定义的:
> (>>);;
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
但这似乎很愚蠢!我错过了更好的方法吗?