你的假设是正确的,在这种情况下,功能是完全一样的。
通过检查生成的IL代码(由Craig演示),您可以看到通过查看F#编译器推断的类型,您可以看到该代码。在这两种情况下,您都会看到int -> int -> int
。 F#语言将这个函数作为一个函数,它需要int
并返回int -> int
,但它实际上被编译为一个具有多个参数的方法(以提高效率)。
如果您在let .. =
之后立即编写fun
,则编译器将其转换为标准函数。但是,你可以,如果你返回功能之前,做一些运算编写的代码是有点不同:
let f1 a b = printfn "hi"; a + b
let f2 a = printfn "hi"; (fun b -> a + b)
现在,这两个功能有很大的不同,因为第二个打印“喜”当你给它只是一个一个参数(然后返回,你可以调用一个函数):
> let f = f2 1;;
hi // The body is called, prints
val f : (int -> int) // and returns function
> f 2;; // This runs the body of 'fun'
val it : int = 3 // which performs the additiion
您可以编写使用f1
相同的代码,但是第一个命令将刚刚创建一个新功能,第二个命令将打印“喜”并进行添加。
在这种情况下,生成的f2
的IL代码将有所不同。这将是一个函数,返回函数(类型FSharpFunc<int, int>
)。 F#显示的类型也不同 - 它将是int -> (int -> int)
而不是int -> int -> int
。你可以用完全相同的方式使用这两种类型的值,但它暗示你第一个可能会给你一个单一的参数。
检查[我的答案](http://stackoverflow.com/questions/2175940/int-int-int-what-does-this-mean-in-f/2176428#2176428),可以帮助你了解差异 –
我增加了问题以包含来自答案的第三个案例。 – hyde