次の F# を検討してください:-
type TestClass() =
let getValFromMap m k = Map.find k m
let addToMap map k i = map |> Map.add k i
let mutable someMap : Map<string,int> = Map.empty
let getValFromMapPartial key = getValFromMap someMap key
let getValFromMapPartialAndTacit = getValFromMap someMap
member this.AddThenGet() =
someMap <- addToMap someMap "A" 10
let value = getValFromMapPartial "A"
printfn "Value from partial = %i" value // prints out
let value = getValFromMapPartialAndTacit "A" // throws
printfn "Value from partial and tacit = %i" value
[<EntryPoint>]
let main argv =
let test = TestClass()
test.AddThenGet()
0
関数getValFromMapPartial
とgetValFromMapPartialAndTacit
は、私の考えでは同一です。F# は、それらがまったく同じ型を持っていると言います: (string -> int)
. それでも、それらは非常に異なる動作をし、非常に異なる方法でコンパイルされます。dotPeek を使用して逆コンパイルすると、それはgetValFromMapPartial
メソッドであることがわかりますが、ctor でgetValFromMapPartialAndTacit
初期化されるフィールドです。
getValFromMapPartialAndTacit
F# は、最高の警告レベル (VS 2012 と 2013 の両方) でも、について文句を言いません。それでも、上記のサンプルでこの関数を呼び出すと失敗します。おそらく、someMap
その可変性にもかかわらず、 の最初の空のバージョンがラップされているためです。
これら2つの機能に違いがあるのはなぜですか? 暗黙的/ポイントフリー バージョンが失敗する可能性があるという F# からの警告があるはずですか?