2015-10-19 4 views
2

Я действительно не получаю, как работать с модулями в Haskell, я действительно новичок в этом языке, и до сих пор я знаю только самые основные вещи, такие как создание функции и такого рода вещи. Сейчас я получаю сообщение об ошибке:Вызов конструктора newtype

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

Экспорт конструктор:

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)) = ... 
+0

Я изменил его, но его все еще говорит мне, «Не в области видимости: конструктор данных«Mat» ' – Argus

+0

@Argus Проверьте перекомпилированы ли модуль после изменения. GHCi также должен забрать изменения без явной перекомпиляции. – chi

+0

Да, все сделано, спасибо. – Argus

Смежные вопросы