我是 F# 新手,最近发现了函数组合运算符 >>
我了解基本原理,所以这样的事情是可能的......
let Add1ToNum x = x +1
let Mul2ToNum y = y * 2
let FuncComp = Add1ToNum >> Mul2ToNum
但是,当您有多个具有不同数量的输入参数的函数时,如何处理组合...例如我希望能够执行以下操作...
let AddNums (x,y) = x+y
let MulNums (x,y) = x*y
let FuncComp = Add1 >> Mul2
这显然不起作用,因为 AddNums 返回一个 int,而 MulNums 期望一个元组。
是否有某种形式的语法可以让我完成此任务,或者如果我想使用函数组合,我是否必须始终执行某种中间函数来转换值?
任何对此的建议将不胜感激。
最佳答案
正如 Yin 和 codekaizen 所指出的,您不能组合这两个函数来创建一个将输入传递给第一个函数,然后将此调用的输出传递给第二个函数的函数(即,使用 >>
运算符)。使用图表,您不能执行以下操作:
+---------+ +---------+
--->| AddNums |--->| MulNums |--->
+---------+ +---------+
一种选择是更改函数并指定其中一个参数,以便可以组合函数。 codekaizen 的示例使用了这个,也可以这样写(如果您使用柯里化(Currying)而不是元组参数):
let AddNums x y = x + y
let MulNums x y = x * y
let FuncComp = (AddNums 1) >> (MulNums 2)
组合函数的另一个选项是创建一个函数,该函数接受多个输入,将两个数字传递给第一个函数,然后使用结果和原始输入中的另一个数字调用第二个函数。使用图表:
-----------------\
--->+---------+ \+---------+
--->| AddNums |--->| MulNums |--->
+---------+ +---------+
如果您需要类似的内容,那么最好的选择是直接编写,因为这可能不会是经常重复的模式。直接来说,这很容易(使用柯里化(Currying)变体):
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'
关于具有多个输入参数的 F# 函数组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3218044/