F# 使用CustomEquality和CustomComparison在DU中重写Equals等的正确方法?
我遇到了一种情况,我想比较一个受歧视的联盟,它有一个案例不能直接比较,我不需要在(自定义)比较中使用。因此,我编写了F# 使用CustomEquality和CustomComparison在DU中重写Equals等的正确方法?,f#,F#,我遇到了一种情况,我想比较一个受歧视的联盟,它有一个案例不能直接比较,我不需要在(自定义)比较中使用。因此,我编写了CustomEquality和CustomComparison函数。唉,我遇到了堆栈溢出,一般来说,我不确定如何处理F#中的这种平等覆盖情况。我读的是唐·赛姆、克里斯·史密斯的书 单位) 覆盖x.Equals(obj)= //这将导致堆栈溢出发生。。。 将obj与 | :? FunkyUnion作为y->(x=y) |_u->false 重写x.GetHashCode()= 将x
CustomEquality
和CustomComparison
函数。唉,我遇到了堆栈溢出,一般来说,我不确定如何处理F#中的这种平等覆盖情况。我读的是唐·赛姆、克里斯·史密斯的书
单位)
覆盖x.Equals(obj)=
//这将导致堆栈溢出发生。。。
将obj与
| :? FunkyUnion作为y->(x=y)
|_u->false
重写x.GetHashCode()=
将x与
|案例1->1
|案例2->2
| _ -> 3
接口系统.i可与
成员x.CompareTo yobj=
将yobj与
| :? FunkyUnion as y->比较x y
|->invalidArg“yobj”无法比较不同类型的值
接口系统.i可与
成员x.CompareTo(y)=
比较x和y
[]
让主argv=
设funky1=FunkyUnion.Case1
设funky2=FunkyUnion.Case2
如果funky1=funky2,则
printfn“!!!”
printfn“!”
0
您在Equals中得到了堆栈溢出,因为您在实现
Equals的同一类型上使用了=
。所以Equals
调用=
,=
调用Equals
,等等
对于Equals
您要做的是:
override this.Equals(o) =
match o with
| :? FunkyUnion as fu ->
match this, fu with
| Case1, Case1 | Case2, Case2 -> true
| Funky f1, Funky f2 -> (* whatever you want to do for this case *)
| _, _ -> false
| _ -> false
您可以用类似的方式更新CompareTo。这应该让你开始 您希望如何将Funky
值等同起来?你在找同样的推荐人吗?或者你想说两个Funky
值永远不能相等吗?为了避免比较Funky值,我将更新这个问题。那么,当比较两个Funky值时会发生什么?也许一开始就不应该在类型上有时髦的值?非常好!也许所有时髦的函数应该总是比较相等,结果是一样的。这不是一个经过深思熟虑的“生产代码”,但我刚才发现一个代码在精神上与我正在努力的目标相似。让我们看看我能否为这个问题提供更多的背景。顺便说一句,MailboxProcessor
是一个有趣的想法……我正在编辑。。。但是,是的,我得到了那么多——只是措辞有点糟糕。:)我试图想出一些简单的,简单的,符合情况的东西。我会更新一下这个问题,看看这是否能让我开始。我想这回答了主要问题。我需要对次要问题做一些研究。干杯
override this.Equals(o) =
match o with
| :? FunkyUnion as fu ->
match this, fu with
| Case1, Case1 | Case2, Case2 -> true
| Funky f1, Funky f2 -> (* whatever you want to do for this case *)
| _, _ -> false
| _ -> false