调用newtype构造函数

Arg*_*gus 2 haskell matrix

我真的不知道如何使用Haskell中的模块,我对这种语言并不熟悉,到目前为止我只知道最基本的东西,比如创建一个函数和那种东西.现在我收到了一个错误

Not in scope: data constructor 'Mat'
Run Code Online (Sandbox Code Playgroud)

这应该是矩阵的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))
Run Code Online (Sandbox Code Playgroud)

我用这种方式在我自己的模块上调用它:

module MatrixShow where
    import Matrix


    instance Matrix (Show a) => Show (Matrix a) where 
        show Mat ((x,y),(a,b)) = show 1
Run Code Online (Sandbox Code Playgroud)

节目1只是一个测试.我甚至不确定那是什么

instance Matrix (Show a) => Show (Matrix a) 意思是,他们只是给了我们这个代码然后告诉我们要弄明白而不解释这些事情中发生的事情.

如果有人能帮助我,我会很感激.我猜测打印矩阵的内容在Haskell中是非常基本的,而且我确定我使它变得比它应该更难,但是作为这种语言的新手我还不确定我是什么有时做.

chi*_*chi 5

导出构造函数:

module Matrix (Matrix(..), fillWith, fromRule, -- etc.
                --   ^^^^
Run Code Online (Sandbox Code Playgroud)

默认情况下,仅导出类型,阻止其他模块访问构造函数.

这条线

instance Matrix (Show a) => Show (Matrix a) where
Run Code Online (Sandbox Code Playgroud)

看起来不对我.Matrix周围有课吗?更有可能的是,应该阅读

instance (Show a) => Show (Matrix a) where
Run Code Online (Sandbox Code Playgroud)

还有,行

show Mat ((x,y),(a,b)) = show 1
Run Code Online (Sandbox Code Playgroud)

是错的.它的左侧应该是这样的

show (Mat ((x,y), f)) = ...
Run Code Online (Sandbox Code Playgroud)