Va bene, sto cercando di avvolgere la mia testa intorno a tipeclass, e quindi sto cercando di definire un typeclass per le operazioni geometriche vettoriali. Sono riuscito a farlo funzionare per component-wise +,-,*,/;
ma sto lottando con il prodotto dot.Haskell Vector Typeclass: Funzione di [a] -> [a] -> a
class GeomVector a where
(>+) :: a -> a -> a
(>-) :: a -> a -> a
(>*) :: a -> a -> a
(>/) :: a -> a -> a
(>.) :: a -> a -> Double
data Vector a = Vec [a]
deriving Show
instance (Fractional a) => GeomVector (Vector a) where
(>+) (Vec u) (Vec v) = Vec $ zipWith (+) u v
(>-) (Vec u) (Vec v) = Vec $ zipWith (-) u v
(>*) (Vec u) (Vec v) = Vec $ zipWith (*) u v
(>/) (Vec u) (Vec v) = Vec $ zipWith (/) u v
(>.) (Vec u) (Vec v) = sum $ u >* v
Ovviamente la mia definizione di istanza per la (>.) Non funziona perché il risultato è di tipo Fractional a
, non Double
.
Ma non so come ottenere questo comportamento dalla dichiarazione nella classe.
quello che avevo come fare è:
class GeomVector [a] where
(>.) :: [a] -> [a] -> a
Ma questo non è valido perché [a]
è un tipo e non una variabile di tipo.
Vorrei poterlo spiegare un po 'meglio, ma onestamente non capisco abbastanza da farlo. Speriamo che il codice renderà un po 'più ovvio ciò con cui sto lottando.
Penso che sia necessaria un'altra variabile di tipo per indicare il tipo di scalari, ad esempio 'classe GeomVector a s dove ... (>.) :: a -> a -> s'. – ErikR
Ciò che si desidera è [sinonimi di tipo associato] (http://www.haskell.org/haskellwiki/GHC/Type_families#An_associated_type_synonym_example) – Lambdageek
La dichiarazione della classe è errata non solo a causa del tipo di risultato (>.). Si tenta di produrre un prodotto punto di '' 'u''' e' '' v''' che sono gli elenchi , non le istanze della classe. –