2

我有以下受歧视的工会:

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在我添加to之前,它具有结构上的平等性Spy这个问题对于如何对记录进行自定义相等很有帮助。但是,我不确定在这种情况下如何最好地实施它。我宁愿不必列举每个案例ActCard

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

这里有什么更好的方法?

4

1 回答 1

9

没有更好的方法。如果您不打算使用默认的结构相等,则必须拼出相等语义。

编辑

可以做这样的事情。

[<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
于 2012-06-12T20:23:17.987 回答