Naprawdę nie rozumiem, jak pracować z modułamiw Haskell jestem naprawdę nowy w tym języku i do tej pory znam tylko najbardziej podstawowe rzeczy, takie jak tworzenie funkcji i tego typu rzeczy. W tej chwili pojawia się błąd, który mówi
Not in scope: data constructor "Mat"
To ma być konstruktor nowej definicji macierzy. To jest moduł:
module Matrix (Matrix, fillWith, fromRule, numRows, numColumns, at, mtranspose, mmap) where
newtype Matrix a = Mat ((Int,Int), (Int,Int) -> a)
fillWith :: (Int,Int) -> a -> (Matrix a)
fillWith (n,m) k = Mat ((n,m), ((_,_) -> k))
fromRule :: (Int,Int) -> ((Int,Int) -> a) -> (Matrix a)
fromRule (n,m) f = Mat ((n,m), f)
numRows :: (Matrix a) -> Int
numRows (Mat ((n,_),_)) = n
numColumns :: (Matrix a) -> Int
numColumns (Mat ((_,m),_)) = m
at :: (Matrix a) -> (Int, Int) -> a
at (Mat ((n,m), f)) (i,j)| (i > 0) && (j > 0) || (i <= n) && (j <= m) = f (i,j)
mtranspose :: (Matrix a) -> (Matrix a)
mtranspose (Mat ((n,m),f)) = (Mat ((m,n),(j,i) -> f (i,j)))
mmap :: (a -> b) -> (Matrix a) -> (Matrix b)
mmap h (Mat ((n,m),f)) = (Mat ((n,m), h.f))
Nazywam to własnym modułem w następujący sposób:
module MatrixShow where
import Matrix
instance Matrix (Show a) => Show (Matrix a) where
show Mat ((x,y),(a,b)) = show 1
Show 1 to tylko test. Nie jestem nawet pewien, co to
instance Matrix (Show a) => Show (Matrix a)
oznacza to, że po prostu dali nam ten kod, a następnie kazali nam go rozgryźć bez wyjaśnienia, co dzieje się w którejkolwiek z tych rzeczy.
Jeśli ktoś może mi pomóc, byłbym wdzięczny. Zgaduję, że drukowanie zawartości matrycy jest bardzo proste w Haskell i jestem pewien, że utrudniam to, niż powinno być, ale wciąż jako nowicjusz tego języka nie jestem pewien, co mam „czasami robię.
Odpowiedzi:
4 dla odpowiedzi № 1Wyeksportuj konstruktor:
module Matrix (Matrix(..), fillWith, fromRule, -- etc.
-- ^^^^
Domyślnie eksportowany jest tylko typ, co uniemożliwia innym modułom dostęp do konstruktora.
Linia
instance Matrix (Show a) => Show (Matrix a) where
wygląda mi źle. Czy jest tam trochę Matrix
klasa w pobliżu? Bardziej prawdopodobne jest, że powinien przeczytać
instance (Show a) => Show (Matrix a) where
Również linia
show Mat ((x,y),(a,b)) = show 1
jest źle. Powinna wyglądać jego lewa strona
show (Mat ((x,y), f)) = ...