与我的问题密切相关,但实际上是一个不同的问题......
考虑以下 F#:-
type TestClass() =
let getValFromMap m k = Map.find k m
let mutable someMap : Map<string,int> = Map.empty
let getValFromMapPartial key = getValFromMap someMap key
let getValFromMapPartialAndTacit = getValFromMap someMap
module TestModule =
let getValFromMap m k = Map.find k m
let mutable someMap : Map<string,int> = Map.empty
let getValFromMapPartial key = getValFromMap someMap key
let getValFromMapPartialAndTacit = getValFromMap someMap
在类案例和模块案例中,getValFromMapPartial
行为getValFromMapPartialAndTacit
方式非常不同,并且编译为 IL 的方式也不同。在类和模块的情况下,前者表现得像一个真正的句法函数,而后者表现得像一个 lambda 计算函数(感谢用户 Marc Sigrist,我知道这一点)。
在模块情况下,类型签名似乎是正确的:-
getValFromMapPartial : key:string -> int
getValFromMapPartialAndTacit : (string -> int)
但是在类的情况下,类型签名是相同的:-
getValFromMapPartial : (string -> int)
getValFromMapPartialAndTacit : (string -> int)
为什么会这样?
既然getValFromMapPartial
在这两种情况下都充当真正的句法函数,为什么在类情况下它会被键入为 lambda 计算函数?