F# 歧视性工会结构/习俗平等

F# 歧视性工会结构/习俗平等,f#,discriminated-union,F#,Discriminated Union,我有以下受歧视的工会: type ActCard = Cellar of card list | Chapel of (card option * card option* card option* card option) | Smithy | Spy of (card -> bool * card -> bool) 在我将card->bool添加到Spy之前,它在结构上是相等的。有助于如何对记录执行自定义相等。

我有以下受歧视的工会:

type ActCard = Cellar of card list 
                | Chapel of (card option * card option* card option* card option) 
                | Smithy | Spy of (card -> bool * card -> bool)
在我将
card->bool
添加到
Spy
之前,它在结构上是相等的。有助于如何对记录执行自定义相等。然而,我不确定在这种情况下如何最好地实施它。我不想在
ActCard
中列举每个案例:

override x.Equals(yobj) =
    match x, yobj with
    |  Spy _, Spy _ -> true
    |  Cellar cards, Cellar cards2 -> cards = cards2
    (* ... etc *)

这里有什么更好的方法

没有更好的方法了。如果不打算使用默认的结构相等,则必须详细说明相等语义

编辑 你可以这样做

[<CustomEquality; CustomComparison>]
type SpyFunc = 
  | SpyFunc of (card -> bool * card -> bool) 
  override x.Equals(y) = (match y with :? SpyFunc -> true | _ -> false)
  override x.GetHashCode() = 0
  interface System.IComparable with
    member x.CompareTo(y) = (match y with :? SpyFunc -> 0 | _ -> failwith "wrong type")

type ActCard = 
  | Cellar of card list 
  | Chapel of (card option * card option * card option * card option) 
  | Smithy 
  | Spy of SpyFunc
[]
类型SpyFunc=
|间谍基金(卡->布尔*卡->布尔)
覆盖x.Equals(y)=(将y与以下内容匹配:?间谍函数->真| ux2;->假)
重写x.GetHashCode()=0
接口系统.i可与
成员x.CompareTo(y)=(将y与以下内容匹配:?间谍基金->0 | |->失败与“错误类型”)
类型ActCard=
|卡牌库
|(卡选项*卡选项*卡选项*卡选项*卡选项)
|铁匠
|间谍队间谍

如果我希望ActCard支持比较,该怎么办?是否需要为间谍基金提供比较?是。您需要使用
CustomComparison
属性并实现
System.IComparable
。我更新了我的答案来演示。非常好,谢谢。当类型是
绑定的一部分时,如何将这些属性应用于该类型?请将属性放在
之后。例如,
类型A()=类结束,[]B()=类结束