2010-06-17 6 views
17

Estoy intentando hacer algunas estructuras de datos para resolver un rompecabezas de gráfico. Estoy tratando de definir los criterios de comparación de un borde, pero no estoy seguro de cómo. Hasta ahora:Definición de su propio ord para un tipo de datos (Haskell)

data Edge = Edge (Set String) Bool 

¿Cómo le digo dejar que el compilador se que quiero bordes para ser declarados iguales si tienen juegos idénticos de cadenas, y no tener la igualdad tienen nada que ver con el valor booleano?

+0

¡No se olvide de la palabra clave 'deriving'! –

Respuesta

34

Aunque no estoy seguro de por qué desea ignorar el valor booleano (tengo curiosidad), para ello tendrá que definir su propio Eq ejemplo; el predeterminado no funcionará, ya que compara todos los campos. Por suerte, esto es fácil:

instance Eq Edge where 
    (Edge s1 _) == (Edge s2 _) = s1 == s2 

Si usted quiere ser capaz de ordenar los bordes, y desea que el pedido de comparar sólo los conjuntos también, su aplicación es muy similar:

instance Ord Edge where 
    (Edge s1 _) `compare` (Edge s2 _) = s1 `compare` s2 

Cada tipo clase define un cierto conjunto de métodos que deben implementarse; Eq requiere == o /=, y Ord requiere <= o compare. (Para saber qué funciones son obligatorias y cuáles son opcionales, puede consultar los documentos.)

+3

Estoy ignorando el booleano porque estoy trabajando con un gráfico dirigido. Sin embargo, debido a que los únicos bordes que son importantes para mí son los que son bidireccionales entre ambos nodos. Estoy usando el booleano como un campo "recíproco", por lo que puedo deshacerme de cualquier borde dirigido que no tenga un borde de retorno equivalente. Luego puedo filtrar en ese booleano para crear un gráfico no dirigido. Es feo pero no se me ocurre nada más a corto plazo. –

9
import Data.Set 

data Edge = Edge (Set String) Bool deriving Show 

instance Eq Edge where 
    (Edge a _) == (Edge b _) = a == b 

instance Ord Edge where 
    compare (Edge a _) (Edge b _) = compare a b 
Cuestiones relacionadas