Knepigt som tusan när man inte är inne i det. Har haft ett par funderingar på om jag inte ska ge upp och satsa på att få det att funka i C++ istället. Men jag håller ut ett tag till. Helst skulle man vilja skriva Jag hade tänkt att man kanske skulle vilja byta till större någon gång, men det går alltså inte? Byta till en datatyp som klarar större tal, för det är väl Integer som kan hålla hur stora som helst? Om du kör med Ah, ok, jag trodde du menade att jag inte skulle skriva ix utan Int. Har målat med lösningsmedel lite för mycket idag... =)Instance-konstruktionen i Haskell
Jag har en klass Vector, till vilken jag har skapat en Matrix enligt:
data Matrix bounds info dist = Matrix ((Array bounds info), dist)
bounds är en godtycklig variabel, som är av klassen Ix. Man kan bland annat använda en tuppel, vilket jag har gjort, en 2-tuppel (x och y). Då tänker jag mig att jag kan köra med:
instance (Ix b, Num a) => Show (Matrix b a c) where
show (Matrix (arr, _)) = show ("y=[" ++ (unlines elem) ++ "]")
where elem = [unwords [show (arr!(x,y))
| x <- range (xl, xh)] ++ ";"
| y <- range (yl,yh)]
((xl, xh), (yl, yh)) = bounds arr
Kort sagt så tar jag rad för rad, mellanrum mellan varje enskilt element, och avslutar varje rad med ";".
Inga problem, men jag får felmeddelandet:
ERROR file:.\RungeKutta.hs:38 - Inferred type is not general enough
*** Expression : show
*** Expected type : Show (Matrix a b c) => Matrix a b c -> String
*** Inferred type : Show (Matrix (a,a) b c) => Matrix (a,a) b c -> String
Inga problem, det kan jag acceptera. Det är klart att bounds måste vara 2-tuppel.
Men hur jag än försöker får jag inte till det. Går det att fixa utan att ändra Matrix?
Eller ska jag göra något i stil med:
data Matrix bounds info dist = Matrix ((Array (xb, yb) info), dist)
istället?Sv: Instance-konstruktionen i Haskell
instance (Ix b, Num a) => Show (Matrix (b, b) a c) where
men det accepteras inte.
Varför inte skrivadata Matrix ix info dist = Matrix (Array (ix,ix) info, dist)
där ix är den typ (t.ex. Int) som indexerar var dimension i arrayen?
Sv:Instance-konstruktionen i Haskell
Det var bland annat medinstance (Ix b, Num a) => Show (Matrix (b, b) a c) where
som jag provade. Förstår inte riktigt varför det inte är tillåtet...
Man kan inte ens skrivainstance (Ix b, Ix d, Num a) => Show (Matrix (b, d) a c) where
Det ger samma fel...
Sv:Instance-konstruktionen i Haskell
Int är väl en word?Sv: Instance-konstruktionen i Haskell
<b>data Matrix ix info dist = Matrix (Array (ix,ix) info, dist)</b>
blir ju inte datatypen hårdkodad. Du kan lätt byta från Int till Integer.Sv:Instance-konstruktionen i Haskell