我真的不知道如何使用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)
意味着,他们只是给了我们这个代码,然后告诉我们要解决它而不解释任何这些事情发生了什么。
如果有人能帮助我,我会很感激。我猜测打印矩阵的内容在Haskell中是非常基本的,而且我确信我会让它变得比它应该更难,但是作为这种语言的新手我还不确定我是什么有时做。
答案 0 :(得分:5)
导出构造函数:
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)) = ...