ここでの私の質問と密接に関連していますが、実際には別の質問です...
次の 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 に異なる方法でコンパイルされます。クラスとモジュールの両方のケースで、前者は真の構文関数のように動作し、後者はラムダ計算関数のように動作します (これはユーザーの Marc Sigrist のおかげです)。
モジュールの場合、型シグネチャは正しいようです:-
getValFromMapPartial : key:string -> int
getValFromMapPartialAndTacit : (string -> int)
しかし、クラスの場合、型シグネチャは同じです:-
getValFromMapPartial : (string -> int)
getValFromMapPartialAndTacit : (string -> int)
なぜそうなるのでしょうか?
どちらの場合でも真の構文関数として機能するのに、getValFromMapPartial
クラスの場合にラムダ計算関数として型付けされるのはなぜですか?