ジェネリック型の一種の特殊化を試みています。
問題は、一般的な方法で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'構文のデータメンバーにアクセスすることは許可されていませんか?