在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
......与此相比
let add =
let rnd = System.Random()
let rnd = rnd.Next(100)
(fun x -> x + rnd)
这些示例遵循与前两个相同的原则,但这两个示例将完全不同于彼此..
答案 0 :(得分:5)
在F#中,与let
关键字绑定的每个表达式都是值,包括函数;函数也是值。
因此,将函数fun x y -> x + y
绑定到add
是创建函数值的一种方法,但更惯用的方法是使用语法let add x y = x + y
。
使用fun
关键字的语法主要用于将函数组合成高阶函数,例如当您想要对内联表达式进行过滤时; e.g:
numbers |> List.filter (fun i -> i % 2 = 0)
但是,您也可以使用这样创建的函数作为返回值,如示例所示。
正如您所说,两个更复杂的例子并不等同,但以下内容与第一个更惯用的函数相同:
let add =
fun x ->
let rnd = System.Random()
let rnd = rnd.Next(100)
x + rnd
这不是惯用语,所以我最常写在OP中:
let add x =
let rnd = System.Random()
let rnd = rnd.Next(100)
x + rnd
虽然它们是等价的,但惯用版本更短,因此,人们认为,更具可读性。