我正在尝试对泛型类型进行一种专业化。
问题是以通用方式制作 AVL 树,在键 k 和数据项 d 之间制作自定义映射。我想尽可能多地使用通用方法,但提供自定义查找:如果 AVL 树类型具有“DateRange”类型的键,那么我可以询问它是否包含 DateTime,它将返回第一个节点DateRange 包含该日期时间。
一般来说,我有:
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 进行查找,那么我们使用特殊的“包含”函数。
这甚至可能吗?如果是这样,我该怎么做。
我的编译器目前在上面突出显示的部分告诉我“未定义值或构造函数“树”。我不明白这一点,因为基本相同的代码在主类型定义中工作正常。您是否不允许访问“with”构造中的数据成员?