¿Hay alguna manera (cualquier forma) de implementar restricciones en clases de tipos?¿Hay alguna manera de implementar restricciones en las clases de tipos de Haskell?
Como un ejemplo de lo que estoy hablando, supongamos que quiero implementar un grupo como una clase de tipo. Así que un tipo sería un grupo si hay tres funciones:
class Group a where
product :: a -> a -> a
inverse :: a -> a
identity :: a
Pero esas no son ninguna función, pero deben estar relacionados por algunas limitaciones. Por ejemplo:
product a identity = a
product a (inverse a) = identity
inverse identity = identity
etc ...
¿Hay una manera de hacer cumplir este tipo de restricción en la definición de la clase para que cualquier instancia heredaría automáticamente? Como un ejemplo, supongamos que me gustaría implementar el grupo C2, que se define por:
data C2 = E | C
instance Group C2 where
identity = E
inverse C = C
Este dos definiciones determina de forma única C2 (las limitaciones anteriormente definen todas las operaciones posibles - de hecho, C2 es el único grupo posible con dos elementos debido a las limitaciones). ¿Hay alguna manera de hacer que esto funcione?
(Er, 'C inversa C = C', ¿no?) – dave4420
sí, gracias por notar –
Esas restricciones suelen llamarse * leyes * ejemplo, leyes de Mónada. – mb14