1

我正在尝试对泛型类型进行一种专业化。

问题是以通用方式制作 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”构造中的数据成员?

4

0 回答 0