我试图创建一组类型,这些类型应该定义相等以便相互比较。
我没有遇到任何问题:
[<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
。
有没有办法像这样实现跨类型的平等?它们都是具有相同基础类型的单一类型联合的要求是否更容易?
脚注:是的,我意识到这可能不是一个好主意,但我想尝试一下,看看它能满足我的需求。我的最终目标是创建不能代替彼此传递的类型,但仍允许进行相等比较而不创建包装类型联合 - 欢迎其他建议:)