型制約のあるインターフェースを一般的に機能させるのに問題があります。
これがタイプです
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>'を統合すると、結果の型は無限になります。