/ / Wywoływanie konstruktora nowego typu - haskell, matrix

Wywołanie konstruktora newtype - haskell, matrix

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 № 1

Wyeksportuj 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)) = ...