que estoy tratando de crear una "jerarquía" de las clases de tipos algebraicos, de la siguiente manera:jerarquía de clases tipo semigrupo/Monoid/Grupo de errores Haskell
class Semigroup a where
(.*) :: a -> a -> a
foldr1 (.*) = foldl1 (.*) -- GHCi error: "`foldr1' is not a (visible) method of class `Semigroup'"
class (Semigroup a) => Monoid a where
identity :: a
(.*) identity = id :: a -> a -- GHCi error: "`.*' is not a (visible) method of class `Monoid'"
class (Monoid a) => Group a where
inverse :: a -> a
Por lo tanto, los grupos son monoides y monoides son semigrupos. Sin embargo, recibo errores de que las clases no pueden ver las funciones de su clase principal.
Estos errores me molestan porque supuse que al escribir (por ejemplo) class (Semigroup a) => Monoid a
la clase Monoid a
podría ver la función (.*)
. Y, además, el tipo de foldr1
en el Preludio no tiene restricciones, por lo que asumí que foldr1
funcionaría en este contexto.
Para aclarar, lo que estaba buscando era implementar los axiomas para semigrupos, monoides y grupos como clases de tipos. Por lo tanto, la clase 'Semigroup a' debe venir con una operación binaria asociativa' (. *) :: a -> a -> a'. Traté de implicar la asociatividad usando 'foldr1', pero este fue mi tercer intento, precedido por' (x. * Y). * Z = x. * (Y. * Z) 'y' \ xyz -> (x. * y). * z = \ xyz -> x. * (y. * z) '. Luego quería que la clase 'Monoid a' fuera una subclase de' Subgroup a', heredando la operación binaria '(. *)' Y mostrando cómo interactúa con el elemento 'identity' (es decir, trivialmente). –
¿Está tratando de establecer las leyes para '(. *)'? No puedes hacer eso en las declaraciones de clase; Creo que debes mirar las reglas de reescritura para obtener el efecto que deseas. – yatima2975
@ yatima2975 Lo busqué y aún no lo he probado, pero parece exactamente lo que estoy buscando. Muchas gracias –