2015-10-19 51 views
2

我真的不知道如何使用Haskell中的模塊,我對這種語言非常陌生,至今我只知道最基本的東西,比如創建一個函數,東東。現在,我得到那個說調用一個新類型的構造函數

Not in scope: data constructor 'Mat' 

這應該是一個矩陣的定義NEWTYPE構造一個錯誤。這是模塊:

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

我改變了它,但它仍然告訴我,「不在範圍:數據構造「墊'」 – Argus

+0

@Argus檢查是否重新編譯更改後的模塊。 GHCi也應該在沒有明確重新編譯的情況下選擇更改。 – chi

+0

是的,它做到了,謝謝。 – Argus

相關問題