3

ここでの私の質問と密接に関連していますが、実際には別の質問です...

次の 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

クラスの場合とモジュールの場合の両方で、非常に異なる方法getValFromMapPartialgetValFromMapPartialAndTacit動作し、IL に異なる方法でコンパイルされます。クラスとモジュールの両方のケースで、前者は真の構文関数のように動作し、後者はラムダ計算関数のように動作します (これはユーザーの Marc Sigrist のおかげです)。

モジュールの場合、型シグネチャは正しいようです:-

getValFromMapPartial : key:string -> int
getValFromMapPartialAndTacit : (string -> int)

しかし、クラスの場合、型シグネチャは同じです:-

getValFromMapPartial : (string -> int)
getValFromMapPartialAndTacit : (string -> int)

なぜそうなるのでしょうか?

どちらの場合でも真の構文関数として機能するのに、getValFromMapPartialクラスの場合にラムダ計算関数として型付けされるのはなぜですか?

4

1 に答える 1