F#Function具有多个输入参数的组合

Mar*_*arl 6 f#

我是F#的新手,最近我发现了函数组合运算符>>

我理解基本原则,以便这样的事情成为可能....

let Add1ToNum x = x +1
let Mul2ToNum y = y * 2
let FuncComp = Add1ToNum >> Mul2ToNum
Run Code Online (Sandbox Code Playgroud)

但是,当你有几个具有不同数量的输入参数的函数时,如何处理合成...例如,我希望能够执行以下操作...

let AddNums (x,y) = x+y
let MulNums (x,y) = x*y
let FuncComp = Add1 >> Mul2
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,因为AddNums返回一个int,而MulNums期待一个元组.

是否有某种形式的语法允许我完成此操作,或者如果我想使用函数组合,我是否必须始终执行某种中间函数来转换值?

任何有关这方面的建议将不胜感激.

Tom*_*cek 8

正如Yin和codekaizen指出的那样,你不能组合这两个函数来创建一个函数,该函数将输入传递给第一个函数,然后将该调用的输出传递给第二个函数(即使用th >>运算符).使用图表,你不能这样做:

     +---------+    +---------+
 --->| AddNums |--->| MulNums |--->
     +---------+    +---------+
Run Code Online (Sandbox Code Playgroud)

一种选择是更改功能并指定其中一个参数,以便可以组合功能.codekaizen的例子使用了这个,也可以像这样编写(如果你使用currying而不是tupled参数):

let AddNums x y = x + y  
let MulNums x y = x * y  
let FuncComp = (AddNums 1) >> (MulNums 2)
Run Code Online (Sandbox Code Playgroud)

组合函数的另一个选项是创建一个函数,它接受几个输入,将两个数字传递给第一个函数,然后用结果调用第二个函数,从原始输入调用另一个数字.使用图表:

 -----------------\
 --->+---------+   \+---------+
 --->| AddNums |--->| MulNums |--->
     +---------+    +---------+
Run Code Online (Sandbox Code Playgroud)

如果你需要这样的东西,那么最好的选择是直接写,因为这可能不是一个经常重复的模式.直接,这很容易(使用curried变体):

let AddNums x y = x + y  
let MulNums x y = x * y  
let FuncComp x y z = AddNums z y |> (MulNums z)
Run Code Online (Sandbox Code Playgroud)

如果你想更普遍地写这样的东西(或者仅仅是为了好奇),你可以写这样的东西(这次使用函数的tupled版本).该&&&运营商的灵感来自箭头:

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'
Run Code Online (Sandbox Code Playgroud)