Unión discriminada igualdad estructural/aduanera
Frecuentes
Visto 1,368 veces
2
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í?
1 Respuestas
8
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
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas f# discriminated-union or haz tu propia pregunta.
¿Qué pasa si quiero que ActCard admita la comparación? ¿Es necesario proporcionar una comparación para
SpyFunc
? - Nick HeinerSi. Necesitarás usar el
CustomComparison
atribuir e implementarSystem.IComparable
. Actualicé mi respuesta para demostrar. - DanielExcelente, gracias. ¿Cómo puede aplicar esos atributos a un tipo cuando es parte de un
and
¿vinculante? - Nick HeinerPoner los atributos después
and
. Por ejemplo,type A() = class end and [<CustomEquality; CustomComparison>] B() = class end
. - Daniel