正如Yin和codekaizen指出的那样,您无法组合这两个函数来创建一个函数,该函数将输入传递给第一个函数,然后将此调用的输出传递给第二个函数(即使用
>>
运算符)。使用图表,您不能执行以下操作:
+
+
一种选择是更改函数并指定其中一个参数,以便可以组合这些函数。codekaizen的示例使用了这种方式,如果您使用柯里化而不是元组参数,则也可以编写如下代码:
let AddNums x y = x + y
let MulNums x y = x * y
let FuncComp = (AddNums 1) >> (MulNums 2)
另一种组合函数的选项是创建一个接受多个输入的函数,将两个数字传递给第一个函数,然后使用结果和原始输入中的另一个数字调用第二个函数。使用图示:
+
如果您需要类似的东西,最好的选择是直接编写,因为这可能不是一个经常重复的模式。直接编写很容易(使用柯里化变体):
let AddNums x y = x + y
let MulNums x y = x * y
let FuncComp x y z = AddNums z y |> (MulNums z)
如果你想更一般地编写类似的东西(或者只是出于好奇),你可以像这样编写代码(这次使用函数的元组版本)。
&&&
操作符受到
Arrows的启发。
let AddNums (x,y) = x + y
let MulNums (x,y) = x * y
let (&&&) f g (a, b) = (f a, g b)
let FuncComp = (AddNums &&& id) >> MulNums
// First two numbers are added, result is multiplied by the third one
FuncComp ((9, 12), 2) // Gives '42'
AddNum >> MulNums
的意图,因为 AddNums 的输出是一个单独的数字,因此不符合 MulNums 的有效输入格式,这意味着这两个函数无法组合使用。 - Yin Zhu