Curried vs Tupled Functions
在 F#,Curried 函数和 Tupled 函数中,有两种方法可以定义具有多个参数的函数。
let curriedAdd x y = x + y // Signature: x:int -> y:int -> int
let tupledAdd (x, y) = x + y // Signature: x:int * y:int -> int
从 F#外部定义的所有函数(例如 .NET 框架)都在 F#中使用 Tupled 形式。F#核心模块中的大多数功能都与 Curried 形式一起使用。
Curried 形式被认为是惯用的 F#,因为它允许部分应用。使用 Tupled 表单时,以下两个示例都不可能。
let addTen = curriedAdd 10 // Signature: int -> int
// Or with the Piping operator
3 |> curriedAdd 7 // Evaluates to 10
其背后的原因是 Curried 函数在使用一个参数调用时返回一个函数。欢迎来函数编程!!
let explicitCurriedAdd x = (fun y -> x + y) // Signature: x:int -> y:int -> int
let veryExplicitCurriedAdd = (fun x -> (fun y -> x + y)) // Same signature
你可以看到它是完全相同的签名。
但是,在与其他 .NET 代码连接时,如编写库时,使用 Tupled 表单定义函数非常重要。