F#参数传递

时间:2012-07-09 09:34:33

标签: f# tuples currying

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

不仅仅是一种风格,咖喱风格和参数可以是简单的值或元组。

e.g。

someFunc (a,b) =

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

(1,2) |> someFunc

这是对的吗?

2 个答案:

答案 0 :(得分:6)

这样可以正常工作 - 区别在于你有

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

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

let partial = fun t -> f (1,t)
let partial2 = f2 1

答案 1 :(得分:5)

是的,所有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# methods是“元组样式”(这是F#粘合到标准.NET面向对象功能的地方之一)。