我一直认为 F# 有两种不同的方式来传递参数,咖喱风格和元组风格。这真的正确吗?
不就是一种风格吗,咖喱风格,参数既可以是简单的值,也可以是元组。
例如
someFunc (a,b) =
这不是一个带有一个恰好是元组的咖喱风格参数的函数吗?因此允许我使用管道运算符将元组传递给这个函数?(元组的元素被命名的地方)
(1,2) |> someFunc
它是否正确?
这会很好用 - 不同之处在于你有
let f (a,b) = ...
let f2 a b = ...
那么您可以轻松地创建一个部分应用的 f2,但是对于 f 它并不能很好地工作 - 您必须这样做
let partial = fun t -> f (1,t)
let partial2 = f2 1
是的,所有 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 面向对象功能相结合的地方之一)。