6

我一直认为 F# 有两种不同的方式来传递参数,咖喱风格和元组风格。这真的正确吗?

不就是一种风格吗,咖喱风格,参数既可以是简单的值,也可以是元组。

例如

someFunc (a,b) =

这不是一个带有一个恰好是元组的咖喱风格参数的函数吗?因此允许我使用管道运算符将元组传递给这个函数?(元组的元素被命名的地方)

(1,2) |> someFunc

它是否正确?

4

2 回答 2

6

这会很好用 - 不同之处在于你有

let f (a,b) = ...
let f2 a b = ...

那么您可以轻松地创建一个部分应用的 f2,但是对于 f 它并不能很好地工作 - 您必须这样做

let partial = fun t -> f (1,t)
let partial2 = f2 1
于 2012-07-09T09:43:52.157 回答
6

是的,所有 F#函数都是“咖喱风格”。当您有如下定义时:

let someFunc (a,b) = a + b

你有一个函数,它接受一个参数,一个元组,它被模式匹配分解(是的,模式匹配在像这样令人惊讶的甜蜜地方可用)。它等效于以下定义,它将模式匹配移动到函数的主体:

let someFunc t = 
    match t with 
    | a, b -> a + b

这也相当于

let someFunc = function
    | a, b -> a + b

第一个版本,在参数本身中具有模式匹配,在这个简单命名绑定的实例中显然更可取。

但是请注意,F#方法是“元组样式”(这是 F# 与标准 .NET 面向对象功能相结合的地方之一)。

于 2012-07-09T15:08:28.660 回答