您的假设是正确的,在这种情况下,功能完全相同。
您可以通过检查生成的 IL 代码(如 Craig 所演示的那样)看到这一点,您还可以通过查看 F# 编译器推断的类型来看到这一点。在这两种情况下,您都会看到int -> int -> int
. F# 语言将其视为一个接受int
和返回的函数,int -> int
但实际上它被编译为具有多个参数的方法(为了提高效率)。
如果您fun
紧跟let .. =
其后编写,则编译器会将其转换为标准函数。但是,如果您在返回函数之前进行一些计算,您可以编写稍微不同的代码:
let f1 a b = printfn "hi"; a + b
let f2 a = printfn "hi"; (fun b -> a + b)
现在这两个函数非常不同,因为第二个函数在你只给它一个参数时打印“hi”(然后它返回一个你可以调用的函数):
> 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
,但第一个命令将创建一个新函数,第二个命令将打印“hi”并进行添加。
在这种情况下,生成的 IL 代码f2
会有所不同。它将是一个返回函数(类型为FSharpFunc<int, int>
)的函数。F# 显示的类型也不同 - 它将int -> (int -> int)
代替int -> int -> int
. 您可以以完全相同的方式使用这两种类型的值,但它暗示您给第一种类型一个参数时可能会产生一些效果。