3

型制約のあるインターフェースを一般的に機能させるのに問題があります。

これがタイプです

type LeftistHeap<'a when 'a : comparison> =
...
    interface IHeap<LeftistHeap<'a>, 'a> with
...
        member this.Insert (x : 'a) = LeftistHeap.insert x this

とインターフェース

type IHeap<'a when 'a : comparison> =
    inherit System.Collections.IEnumerable
    inherit System.Collections.Generic.IEnumerable<'a>
...
type IHeap<'c, 'a when 'c :> IHeap<'c, 'a> and 'a : comparison> =
    inherit IHeap<'a>
...
    abstract member Insert : 'a -> 'c

このコードは問題なく動作します

let insertThruList l h  =
    List.fold (fun (h' : LeftistHeap<'a>) x -> h'.Insert  x  ) h l

しかし、インターフェイスのコードを一般化しようとすると

let insertThruList l h  =
    List.fold (fun (h' : IHeap<_,'a>) x -> h'.Insert  x  ) h l

h'でこのエラーが発生します。挿入

型の不一致。'bを期待します
が、IHeap <'b、' a>を指定する
と、''b'と'IHeap <'b、'a>'を統合すると、結果の型は無限になります。

4

2 に答える 2

4

'cコンパイラの権利:必要な場所でを使用しようとしていますIHeap<'c,_>。以来'c :> IHeap<'c,_>、1つの解決策はアップキャストを挿入することです。

let insertThruList l h =
    List.fold (fun (h' : IHeap<_,_>) x -> h'.Insert  x :> _) h l

IHeap<_,_>または、入力を(正確に)ではなく、特定のサブタイプにすることを指定できます。

let insertThruList l h =
    List.fold (fun (h' : #IHeap<_,_>) x -> h'.Insert x) h l

これはおそらくあなたが本当に望んでいるものです(タイプはより具体的です)。これは、より詳細な定義と同等です。

let insertThruList<'c,'a when 'a : comparison and 'c :> IHeap<'c,'a>> l h =
    List.fold (fun (h' : 'c) x -> h'.Insert x) h l
于 2012-11-05T18:35:46.460 に答える
2

これはあなたの場合に機能しますか?

let insertThruList l (h : 'T when 'T :> IHeap<'T, 'a> )  =
    List.fold (fun (h' : 'T) x -> h'.Insert  x  ) h l
于 2012-11-05T18:36:05.980 に答える