F#:使用自定义相等运算符的相互递归类型定义

F#:使用自定义相等运算符的相互递归类型定义,f#,equality,discriminated-union,F#,Equality,Discriminated Union,我试图创建一组类型,这些类型应该定义相等,以便相互比较 我顺利地走到了这一步: [<CustomEquality; NoComparison>] type Foo = Foo of string with override x.Equals (y : obj) = match y with | :? Foo y' -> match x with

我试图创建一组类型,这些类型应该定义相等,以便相互比较

我顺利地走到了这一步:

[<CustomEquality; NoComparison>]
type Foo = Foo of string
    with
        override x.Equals (y : obj) =
            match y with
            | :? Foo y' ->
                match x with
                | Foo x' -> transform x' = transform y'
            | :? Bar y' ->
                match x with
                | Foo x' -> transform x' = transform y'
            | _ -> false

        // x.GetHashCode omitted for brevity

and [<CustomEquality; NoComparison>] Bar = Bar of String
    // similar definitions here
抱怨需要一个
Bar
s列表来代替
foos:Foo list
。如果我将匿名函数更改为
(fun(f:Foo)->f=bar)
,编译器会抱怨它需要一个
Foo
来代替
bar:bar

有没有一种方法可以实现这样的跨类型平等?它们都是具有相同底层类型的单壳类型联合的要求是否使其更容易实现



脚注:是的,我意识到这可能不是一个好主意,但我想尝试一下,看看它能多适合我的需要。我的最终目标是创建不能互相传递的类型,但仍然允许相等比较,并且不创建包装类型联合-欢迎其他建议:)

您是否尝试过
fun f->f.Equals bar
let foos : Foo list = getFoos ()
let bar : Bar = getBar ()
foos |> List.exists (fun f -> f = bar)