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

时间:2017-04-17 12:30:56

标签: 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
                | 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

然而,这似乎不能让我比较它们。例如,此代码无法编译:

let foos : Foo list = getFoos ()
let bar : Bar = getBar ()
foos |> List.exists (fun f -> f = bar)

抱怨Bar的列表预计会取代foos : Foo list。如果我将匿名函数更改为(fun (f : Foo) -> f = bar),则编译器会抱怨它需要Foo代替bar : Bar

有没有办法像这样实现跨类型的平等?它们都是具有相同基础类型的单一类型联合的要求是否更容易?

脚注:是的,我意识到这可能不是一个好主意,但我想尝试一下,看看它能满足我的需求。我的最终目标是创建不能代替彼此传递的类型,但仍允许进行相等比较而不创建包装类型联合 - 欢迎其他建议:)

0 个答案:

没有答案