Unión discriminada igualdad estructural/aduanera

Tengo la siguiente unión discriminada:

type ActCard = Cellar of card list 
                | Chapel of (card option * card option* card option* card option) 
                | Smithy | Spy of (card -> bool * card -> bool)

Tenía igualdad estructural hasta que agregué el card -> bool a Spy. Esta pregunta es útil para saber cómo hacer una igualdad personalizada para los registros. Sin embargo, no estoy seguro de cuál es la mejor manera de implementarlo en esta situación. Preferiría no tener que enumerar cada caso en ActCard:

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

¿Cuál es un mejor enfoque aquí?

preguntado el 12 de junio de 12 a las 21:06

1 Respuestas

No hay un mejor enfoque. Si no va a utilizar la igualdad estructural predeterminada, tendrá que deletrear la semántica de igualdad.

EDITAR

Usted podría haz algo como esto.

[<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

Respondido el 13 de junio de 12 a las 19:06

¿Qué pasa si quiero que ActCard admita la comparación? ¿Es necesario proporcionar una comparación para SpyFunc? - Nick Heiner

Si. Necesitarás usar el CustomComparison atribuir e implementar System.IComparable. Actualicé mi respuesta para demostrar. - Daniel

Excelente, gracias. ¿Cómo puede aplicar esos atributos a un tipo cuando es parte de un and ¿vinculante? - Nick Heiner

Poner los atributos después and. Por ejemplo, type A() = class end and [<CustomEquality; CustomComparison>] B() = class end. - Daniel

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.