Todavía nuevo a Haskell, he chocado contra un muro con lo siguiente:Tipo con funciones dependiendo de un tipo adicional
que estoy tratando de definir algunas clases de tipos de generalizar un montón de funciones que utilizan la eliminación de Gauss a resolver sistemas lineales de ecuaciones.
Dado un sistema lineal
M x = k
el tipo a
de los elementos m(i,j) \elem M
puede ser diferente del tipo b
de x
y k
. Para poder resolver el sistema, a
debe ser una instancia de Num
y b
deben tener los operadores de multiplicación/adición con b
, como en el siguiente:
class MixedRing b where
(.+.) :: b -> b -> b
(.*.) :: (Num a) => b -> a -> b
(./.) :: (Num a) => b -> a -> b
Ahora, incluso en la implementación más trivial de estos operadores, voy a Could not deduce a ~ Int. a is a rigid type variable
errores (olvidémonos de ./.
que requiere Fractional
)
data Wrap = W { get :: Int }
instance MixedRing Wrap where
(.+.) w1 w2 = W $ (get w1) + (get w2)
(.*.) w s = W $ ((get w) * s)
he leído varios tutoriales sobre las clases de tipos, pero no puedo encontrar ningún puntero a lo que realmente va mal.
Ya hay un paquete que define esta clase: http://hackage.haskell.org/packages/archive/vector-space/0.8.0/doc/html/Data-VectorSpace.html Puede echar un vistazo allí. –
@SjoerdVisscher: ¡Gracias! – bbtrb