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

标签 f#

我是 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/

相关文章:

f# - 在 F# 中不可变

f# - 支持成员约束的静态扩展方法

.net - Dapper 和 Postgres - 打印查询

f# - FSharp 参数模式匹配。为什么声明分配自而不是分配给?

f# - 在类型中定义选项的正确方法

c# - ASP.NET MVC F# Controller 操作忽略参数

reflection - 如何在 F# 中获取给定联合类型的每个联合案例的类型

c# - F# 类型到 Json 正在输出 Name@ 和 Name

database - 使用 F# 创建插入语句

visual-studio - F#有 "Show potential fixes(ctrl+.)"支持吗