由于支持柯里化,F# 函数与普通 CLR 方法有很大不同。例如函数
let inc a = a + 1
会有类型Microsoft.FSharp.Core.FSharpFunc<int,int>
。它会产生 C# 互操作性问题。必须专门设计函数以便从 C# 中轻松调用。
这种设计背后的基本原理是什么?我相信原因是咖喱支持。但是柯里化可以使用闭包来实现。例如这段代码:
let add a b = a + b
let inc = add 1
可以很容易地被编译器转换成这个:
let add a b = a + b
let inc = fun x -> add 1 + x
在这种情况下, add 和 inc 都可以是普通System.Func
对象。我相信这个设计决定背后有一些有趣的原因。