1

ジェネリック型の一種の特殊化を試みています。

問題は、一般的な方法でAVLツリーを作成し、キーkとデータ項目dの間にカスタムマップを作成することです。できるだけ一般的なアプローチを使用したいのですが、カスタムルックアップを提供します。AVLツリータイプに「DateRange」タイプのキーがある場合、DateTimeが含まれているかどうかを確認すると、最初のノードが返されます。 DateRangeには、そのDateTimeが含まれています。

一般的に私は持っています:

type AvlTree<'k,'d when 'k:comparison and 'd:equality> 
    (
        tree : tree<'k,'d>
    )=

    member this.Contains(k) = contains k tree

let rec contains k = function // appears above. Moved here for clarity of exposition
    | Nil -> None
    | Node(_, l, (kx,dx), r) ->
        if k = kx then Some(dx)
        else
            if k < kx then contains k l
            else contains k r

(テンプレートとしてhttp://en.wikibooks.org/wiki/F_Sharp_Programming/Advanced_Data_Structures#AVL_Treesを使用しています)

私はそれを次のように拡張しようとしています:

type AvlTree<'k,'d when 'k :> DateRange and 'd:equality> with
    member this.Contains(k:DateTime) = splcontains k **tree**

したがって、ツリータイプ自体にDateRangeキータイプがあり、DateTimeでルックアップを実行している場合は、特別な「contains」関数を使用するという考え方です。

これも可能ですか?もしそうなら、どうすればいいですか。

私のコンパイラは現在、上記の強調表示された部分で'値またはコンストラクタ'ツリー'が定義されていません'と言っています。本質的に同一のコードがメインの型定義でうまく機能するので、私はこれを理解していません。'with'構文のデータメンバーにアクセスすることは許可されていませんか?

4

0 に答える 0