Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 使用CustomEquality和CustomComparison在DU中重写Equals等的正确方法?_F# - Fatal编程技术网

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