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 表单定义函数非常重要。