El paquete constructivo-álgebra le permite definir los casos de algebraica módulos (como espacios vectoriales pero utilizando un anillo donde se requiere un campo)Definición de un módulo de álgebra usando el paquete constructivo-álgebra
Este es mi intento de definir un módulo :
{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances #-}
module A where
import Algebra.Structures.Module
import Algebra.Structures.CommutativeRing
import Algebra.Structures.Group
newtype A = A [(Integer,String)]
instance Group A where
(A a) <+> (A b) = A $ a ++ b
zero = A []
neg (A a) = A $ [((-k),c) | (k,c) <- a]
instance Module Integer A where
r *> (A as) = A [(r <*> k,c) | (k,c) <- as]
fracasa por:
A.hs:15:10:
Overlapping instances for Group A
arising from the superclasses of an instance declaration
Matching instances:
instance Ring a => Group a -- Defined in Algebra.Structures.Group
instance Group A -- Defined at A.hs:9:10-16
In the instance declaration for `Module Integer A'
A.hs:15:10:
No instance for (Ring A)
arising from the superclasses of an instance declaration
Possible fix: add an instance declaration for (Ring A)
In the instance declaration for `Module Integer A'
Failed, modules loaded: none.
Si comento la instancia Group
a cabo, a continuación:
A.hs:16:10:
No instance for (Ring A)
arising from the superclasses of an instance declaration
Possible fix: add an instance declaration for (Ring A)
In the instance declaration for `Module Integer A'
Failed, modules loaded: none.
leí esto como que requiere una instancia de Ring A
tener Module Integer A
lo cual no tiene sentido y es no requerido en la definición de la clase:
class (CommutativeRing r, AbelianGroup m) => Module r m where
-- | Scalar multiplication.
(*>) :: r -> m -> m
¿Podría explicar esto?
¿Le preocupa que su instancia 'Group' para' A' no defina realmente un grupo? Por ejemplo, 'let a = [(1," foo ")]', then 'a <+> neg a = [(1," foo "), (- 1," foo ")]' que no es lo mismo que 'cero'. –
Sí, lo sé. La idea original era reducir 'a ++ b' agrupando cadenas idénticas. Me salté la reducción a la forma normal para simplificar el ejemplo. – user21338