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)
它是否正确?
这样可以正常工作 - 不同之处在于你有
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)
是的,所有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面向对象功能的地方之一)。
| 归档时间: |
|
| 查看次数: |
2547 次 |
| 最近记录: |