我正在努力做一种通用类型的专业化。
问题是以通用方式制作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进行查找,那么我们使用特殊的“包含”函数。
这甚至可能吗?如果是这样,我该怎么做。
我的编译器当前正在告诉我'上面突出显示的部分未定义值'或构造函数'树'。我不明白这一点,因为基本相同的代码在主类型定义中工作正常。您是否被允许访问“with”构造中的数据成员?