F#参数传递

Rog*_*son 6 f# tuples currying

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

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

例如

someFunc (a,b) =
Run Code Online (Sandbox Code Playgroud)

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

(1,2) |> someFunc
Run Code Online (Sandbox Code Playgroud)

它是否正确?

Joh*_*mer 6

这样可以正常工作 - 不同之处在于你有

let f (a,b) = ...
let f2 a b = ...
Run Code Online (Sandbox Code Playgroud)

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

let partial = fun t -> f (1,t)
let partial2 = f2 1
Run Code Online (Sandbox Code Playgroud)


Ste*_*sen 6

是的,所有F#函数都是“ curry样式”。当您有如下定义时:

let someFunc (a,b) = a + b
Run Code Online (Sandbox Code Playgroud)

您有一个带一个参数的函数,一个元组,它已通过模式匹配分解(是的,在这样令人惊讶的甜蜜地方可以使用模式匹配)。它等效于以下定义,该定义将模式匹配移至函数主体:

let someFunc t = 
    match t with 
    | a, b -> a + b
Run Code Online (Sandbox Code Playgroud)

这也相当于

let someFunc = function
    | a, b -> a + b
Run Code Online (Sandbox Code Playgroud)

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

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