ancora nuovo per Haskell, ho colpito un muro con il seguente:Tipo definizione di classe con le funzioni a seconda di un ulteriore tipo
sto cercando di definire alcune classi di tipo generalizzare un gruppo di funzioni che utilizzano l'eliminazione gaussiana per risolvere sistemi lineari di equazioni.
Dato un sistema lineare
M x = k
tipo a
degli elementi m(i,j) \elem M
può essere diverso dal tipo di b
x
e k
. Per poter risolvere il sistema, a
dovrebbe essere un'istanza di Num
e b
dovrebbe avere operatori moltiplicazione/addizione con b
, come nel seguente:
class MixedRing b where
(.+.) :: b -> b -> b
(.*.) :: (Num a) => b -> a -> b
(./.) :: (Num a) => b -> a -> b
Ora, anche nella realizzazione più banale di questi operatori, prendo Could not deduce a ~ Int. a is a rigid type variable
errori (Lasciamo perdere ./.
che richiede Fractional
)
data Wrap = W { get :: Int }
instance MixedRing Wrap where
(.+.) w1 w2 = W $ (get w1) + (get w2)
(.*.) w s = W $ ((get w) * s)
ho letto diversi tutorial su classi di tipo ma non riesco a trovare nessun puntatore a ciò che accade effettivamente sbagliato.
C'è già un pacchetto che definisce questa classe: http://hackage.haskell.org/packages/archive/vector-space/0.8.0/doc/html/Data-VectorSpace.html Puoi dare un'occhiata qui. –
@SjoerdVisscher: Grazie! – bbtrb