泛型类型上的F#相等/可比较

泛型类型上的F#相等/可比较,f#,compare,equality,F#,Compare,Equality,我有这样的记录类型: type Node<'T> = { doStuff: 'T -> unit ; id: int } 型节点单元;id:int} 如何实现相等/可比较,以便仅相等/比较id 注意:这需要在不同类型的节点之间工作。因此,将节点与节点等同/比较。当涉及泛型时,它看起来并不简单。我想为该类型编写一个静态成员将是某种解决方案 static member compareNodes (n1:Node<_>) (n2:Node<_>) =

我有这样的记录类型:

type Node<'T> = { doStuff: 'T -> unit ; id: int }
型节点单元;id:int}
如何实现相等/可比较,以便仅相等/比较id


注意:这需要在不同类型的节点之间工作。因此,将
节点
节点
等同/比较。当涉及泛型时,它看起来并不简单。

我想为该类型编写一个静态成员将是某种解决方案

static member compareNodes (n1:Node<_>) (n2:Node<_>) =
    n1.id.CompareTo(n2.id)
静态成员比较节点(n1:Node)(n2:Node)=
n1.id.CompareTo(n2.id)

可以通过一个公共基类型来完成:

type IHaveId =
    abstract Id : int
    inherit System.IComparable

type [<CustomEquality; CustomComparison>] Node<'T> =
    { DoStuff: 'T -> unit ; Id: int }

    interface IHaveId with
        member n.Id = n.Id

    override n.Equals n' =
        match n' with
        | :? IHaveId as n' -> n.Id = n'.Id
        | _ -> invalidArg "n'" "Tried to equate incompatible types."

    override n.GetHashCode () = n.Id.GetHashCode()

    interface System.IComparable with
        member n.CompareTo n' =
            match n' with
            | :? IHaveId as n' -> n.Id.CompareTo n'.Id
            | _ -> invalidArg "n'" "Tried to compare incompatible types."
类型IHaveId=
摘要Id:int
继承System.i可比较
类型[]节点单元;Id:int}
接口IHaveId与
成员编号=编号
覆盖n等于n'=
匹配
| :? IHaveId为n'->n.Id=n'.Id
|“->invalidArg“n'”试图将不兼容的类型等同起来。”
重写n.GetHashCode()=n.Id.GetHashCode()
接口系统.i可与
比较,比较=
匹配
| :? IHaveId为n'->n.Id.与n'.Id.比较
|“->invalidArg“n'”试图比较不兼容的类型。”
请注意,这不是很快。另外,要小心:公共建筑可以访问
节点