F#中这两个函数有什么区别吗?

时间:2014-12-28 07:48:29

标签: function lambda f# closures

在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)

这些示例遵循与前两个相同的原则,但这两个示例将完全不同于彼此..

1 个答案:

答案 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

虽然它们是等价的,但惯用版本更短,因此,人们认为,更具可读性。