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

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)

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

Mar*_*ann 5

在F#中,与let关键字绑定的每个表达式都是一个,包括函数; 函数也是价值观.

因此,结合功能fun x y -> x + yadd是创建一个函数值的一种方式,但更习惯的方法是使用语法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)

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