Types 带有扩展名的泛型类型的特殊情况

Types 带有扩展名的泛型类型的特殊情况,types,f#,Types,F#,我正在尝试做一种泛型类型的专门化 问题是以通用的方式生成AVL树,在键k和数据项d之间生成自定义映射。我希望尽可能多地使用通用方法,但提供自定义查找:如果AVL树类型具有“DateRange”类型的键,那么我可以询问它是否包含DateTime,它将返回DateRange包含该DateTime的第一个节点 总的来说,我有: type AvlTree<'k,'d when 'k:comparison and 'd:equality> ( tree : tree&

我正在尝试做一种泛型类型的专门化

问题是以通用的方式生成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
类型AvlTree
(
树:树
)=
成员this.Contains(k)=包含k个树
let rec contains k=函数//出现在上面。为了说明清楚,我搬到这里来了
|无->无
|节点(u,l,(kx,dx),r)->
如果k=kx,则一些(dx)
其他的
如果k
(我正在使用作为模板)

我试着这样扩展它:

type AvlTree<'k,'d when 'k :> DateRange and 'd:equality> with
    member this.Contains(k:DateTime) = splcontains k **tree**
使用
成员this.Contains(k:DateTime)=SPLk包含**树**
因此,我们的想法是,如果树类型本身有一个DateRange键类型,并且我们在DateTime上进行查找,那么我们使用一个特殊的“contains”函数

这可能吗?如果是,我该怎么做


我的编译器目前告诉我在上面突出显示的部分上“没有定义值或构造函数树”。我不理解这一点,因为本质上相同的代码在主类型定义中可以正常工作。不允许您访问“with”构造中的数据成员吗?

在这里发现了类似的问题:事实证明这是无法做到的。我通过创建一个具有不同名称的继承类型来解决这个问题:type DTTree(tree:tree(tree)member this.Contains(k:DateTime)=splk treeSorry,我没有仔细阅读这个问题。你是对的。关于错误消息:是的,你不允许访问
。它只是不可见。如果你为访问
定义一个新属性,并在扩展中使用它,所有内容都将编译。但是,专业化将永远不会发生使用(见其他注释)。