En mi proyecto he creado un tipo de datos, que puede contener uno de los pocos tipos de valores (?):Haskell - Comparativa constructor sencilla función
data PhpValue = VoidValue | IntValue Integer | BoolValue Bool
lo que quería hacer ahora, es tener una forma simple de verificar si dos valores del tipo PhpValue
son del mismo constructor (corríjame si me confunden con la terminología aquí, pero básicamente lo que quiero verificar si ambos son, por ejemplo, son IntValue
, sin preocuparme por el valor particular).
Aquí es una función que escribí para que:
sameConstructor :: PhpValue -> PhpValue -> Bool
sameConstructor VoidValue VoidValue = True
sameConstructor (IntValue _) (IntValue _) = True
sameConstructor (BoolValue _) (BoolValue _) = True
sameConstructor _ _ = False
Esto funciona como debería, pero no me gusta mucho: si agrego más constructores (como FloatValue Float
) Voy a tener que reescribe la función, y se hará más grande a medida que mi definición de datos se haga más grande.
La pregunta: ¿Hay alguna manera de escribir esa función, para que su implementación no cambie cuando agregue más constructores?
Para el registro: no quiero cambiar la definición data
, tengo suficiente Mónadas en el resto de mi código tal como es;)
Debe reemplazar los argumentos que nunca usa con '_'. Entonces 'sameConstructor sth els = False' se puede escribir mejor como' sameCOnstructor _ _ = False' y así sucesivamente. Esto hace que el hecho de que no vaya a utilizar esos valores sea más claro. –
Puede reemplazar '(IntValue a)' y otros con '(IntValue _)' también. – sdcvvc