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 表單定義函式非常重要。