Я не дуже розумію, як працювати з модулямив 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)) = ...