(Lo siento con anticipación si la pregunta es estúpida u obvia, no tengo mucha experiencia con Haskell).En Haskell, ¿hay alguna forma de expresar que un tipo debe ser una instancia de una clase de tipo en más de una forma?
¿Hay alguna manera de expresar que un tipo debe ser una instancia de una clase de tipo en más de una forma? Esto se ilustra mejor con un ejemplo (que es probablemente algo tonto): en matemáticas, podemos decir que un semiencogido es un conjunto que es un monoide conmutativo en una operación (que llamaremos adición, identidad 0) y un monoide bajo otro (que llamaremos multiplicación) junto con los requisitos que la multiplicación distribuye sobre la suma y que 0 aniquila todos los elementos bajo multiplicación. Las últimas partes no son importantes aquí.
Supongamos ahora que tienen una clase de tipos Monoid
(que no debe confundirse con Data.Monoid
),
class Monoid m where
unit :: m
operation :: m -> m -> m
y me gustaría crear una clase de tipos Semiring
. De la definición dada anteriormente, me gustaría decir "si el tipo r es un monoide en dos (distintas formas), lo llamaremos semiautomático". Así que me gustaría algo como
class (Monoid r, Monoid r) => Semiring r where ...
que por supuesto no funciona. Ciertamente, el ejemplo se vuelve un poco extraño ya que no hay más funciones que quisiéramos requerir para las semirredes, por lo que la clase de tipo estaría vacía, pero espero que ilustre lo que estoy preguntando (o simplemente pretender que necesitamos alguna función). f:r->r
para Semiring r
).
Así, en el contexto general, estoy pidiendo: Dada una clase de tipos A
, ¿hay una manera de parametrizar una clase de tipos B a
con el requisito de que a
sea una instancia de A
de dos maneras (lo que significa que deben aplicar el a
funciones especificadas por A
de dos maneras)?
Gracias a todos los que han respondido hasta ahora. Casi todas las respuestas podrían ser aceptadas, pero fui con la que obtuvo el mayor número de votos. – gspr