具有扩展名的泛型类型的特例

时间:2012-07-31 12:45:24

标签: types f#

我正在努力做一种通用类型的专业化。

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

0 个答案:

没有答案