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()=类结束
。