1

y 型で非常に奇妙なことが起こっており、これが正当化されるかどうかはまったくわかりません。私はそうではないと思う傾向があります。

このコードは正常に動作します:

   type DictionarySingleton private () = 
      static let mutable instance = Dictionary<string*obj, obj>()
      static member Instance = instance

   let  memoize  (f:'a -> 'b) = 
      fun (x:'a) ->
         let key = f.ToString(), (x :> obj)
         if (DictionarySingleton.Instance).ContainsKey(key) 
         then let r = (DictionarySingleton.Instance).[key]
              r :?> 'b
         else 
              let res = f x 
              (DictionarySingleton.Instance).[key] <- (res :> obj)
              res

そしてこいつらは文句を言う

   type DictionarySingleton private () = 
      static let mutable instance = Dictionary<string*obj, _>()
      static member Instance = instance

   let  memoize  (f:'a -> 'b) = 
      fun (x:'a) ->
         let key = f.ToString(), (x :> obj)
         if (DictionarySingleton.Instance).ContainsKey(key) 
         then let r = (DictionarySingleton.Instance).[key]
              r :?> 'b
         else 
              let res = f x 
              (DictionarySingleton.Instance).[key] <- (res :> obj)
              res

違いは、辞書定義のアンダースコアのみです。推論される型は同じですが、r から型 'b への動的キャストでエラーが発生します。

「この実行時強制...一部の型では実行時型テストは許可されていません..」

私は何かが欠けていますか、それとも大まかなエッジですか?

4

1 に答える 1

1

2 つのステップでコンパイルすると、最初に Type DictionarySingleton、次に Function が機能memoizeします。コンパイラは最初にアンダースコアの型 (ジェネリック型である可能性があります) を把握しようとし、それを決定する前objに r の型を推測しようとするようです。その時点ではまだ に統一されていないobjため、一度にコンパイルすると失敗します。

于 2012-06-24T18:58:40.720 に答える