/ / Виклик конструктора нового типу - haskell, matrix

Виклик конструктора нового типу - haskell, matrix

Я не дуже розумію, як працювати з модулямив Haskell я справді новачок у цій мові, і поки що я знаю лише найосновніші речі, такі як створення функції та подібні речі. Зараз я отримую помилку, яка говорить

Not in scope: data constructor "Mat"

Це має бути конструктором для матриці визначення нового типу. Це модуль:

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))

Я називаю це у власному модулі таким чином:

module MatrixShow where
import Matrix


instance Matrix (Show a) => Show (Matrix a) where
show Mat ((x,y),(a,b)) = show 1

Шоу 1 - просто тест. Я навіть не впевнений, що це

instance Matrix (Show a) => Show (Matrix a) Це означає, що вони просто дали нам цей код, а потім сказали нам розібратися, не пояснюючи, що відбувається в будь-якій з цих речей.

Якщо хтось може мені допомогти, я вдячний. Я здогадуюсь, що друк вмісту матриці є дуже базовим у Haskell, і я "впевнений, що роблю це складніше, ніж це повинно бути, але все ж як новачок цієї мови я не дуже впевнений, що я "Я роблю іноді.

Відповіді:

4 для відповіді № 1

Експорт конструктора:

module Matrix (Matrix(..), fillWith, fromRule, -- etc.
--   ^^^^

За замовчуванням експортується лише тип, не дозволяючи іншим модулям отримати доступ до конструктора.

Лінія

instance Matrix (Show a) => Show (Matrix a) where

виглядає неправильно для мене. Чи є якісь Matrix клас навколо? Швидше, це слід прочитати

instance (Show a) => Show (Matrix a) where

Також, лінія

show Mat ((x,y),(a,b)) = show 1

невірно. Його ліва частина повинна виглядати так

show (Mat ((x,y), f)) = ...