Ove*_*ive 1 lambda f# closures function
在F#中,编写这样的函数之间有什么区别......
let add x y = x + y
或这个...
let add = fun x y -> x + y
当我看到IL时,它们似乎产生完全相同类型的IL.他们肯定"似乎"做同样的事情,但从概念上来说,我觉得它们是不同的,第一个是函数声明,第二个是值"声明",它是一个函数.
此外,如果我们做一个稍微详细的例子..
这个...
let add x =
let rnd = System.Random()
let rnd = rnd.Next(100)
x + rnd
Run Code Online (Sandbox Code Playgroud)
......与此相比
let add =
let rnd = System.Random()
let rnd = rnd.Next(100)
(fun x -> x + rnd)
Run Code Online (Sandbox Code Playgroud)
这些示例遵循与前两个相同的原则,但这两个示例将完全不同于彼此.
在F#中,与let关键字绑定的每个表达式都是一个值,包括函数; 函数也是价值观.
因此,结合功能fun x y -> x + y来add是创建一个函数值的一种方式,但更习惯的方法是使用语法let add x y = x + y.
然而,它们完全相同.
使用fun关键字的语法主要用于将函数组合成高阶函数,例如当您想要对内联表达式进行过滤时; 例如:
numbers |> List.filter (fun i -> i % 2 = 0)
Run Code Online (Sandbox Code Playgroud)
但是,您也可以使用像这样创建的函数作为返回值,如示例所示.
正如您所述,两个更复杂的示例并不相同,但以下内容与第一个更惯用的函数相同:
let add =
fun x ->
let rnd = System.Random()
let rnd = rnd.Next(100)
x + rnd
Run Code Online (Sandbox Code Playgroud)
这不是惯用的,所以我经常把它写成OP:
let add x =
let rnd = System.Random()
let rnd = rnd.Next(100)
x + rnd
Run Code Online (Sandbox Code Playgroud)
虽然它们是等价的,但惯用版本更短,因此,人们认为,更具可读性.