Próbuję zrozumieć typografie wieloparametrowe, ale po prostu nie otrzymuję deklaracji instancji. Zaczynam próbować utworzyć typeklecie InnerProductSpace dla typu Vector, aby móc wykonać produkt punktowy na dwóch wektorach. Na początek chciałem tylko sprawdzić, czy mogę pomnożyć pierwszy element każdego wektora. Oto mój kodWieloparametrowe deklaracje instancji typu
class InnerProductSpace a b c where
dot :: a -> b -> c
data Vector = Vector [Double]
deriving (Show)
instance InnerProductSpace Vector Vector Double where
dot (Vector a) (Vector b) = (head a * head b)
i błąd po próbie użycia funkcji kropka
No instance for (InnerProductSpace Vector Vector c0)
arising from a use of `dot'
The type variable `c0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there is a potential instance available:
instance InnerProductSpace Vector Vector Double
-- Defined at Vector.hs:8:10
Possible fix:
add an instance declaration for
(InnerProductSpace Vector Vector c0)
In the expression: dot a b
In an equation for `it': it = dot a b
Co zrobiłem źle? Dzięki!
zajęcia typu Multi-parametrów są pełne koncepcyjnych przeszkód, natomiast rodziny typu działają jak funkcje na poziomie typu, więc są łatwiejsze. Spójrz na moją odpowiedź dla kogoś o podobnym problemie [tutaj] (http: // stackoverflow.com/a/13035800/1598537) i jak sugeruję, aby używały rodzin typów w celu radzenia sobie z przestrzeniami wektorowymi. – AndrewC