无法弄清楚此矩阵数据类型模块的含义,需要显示其内容

时间:2015-10-16 05:59:06

标签: haskell matrix

好吧,所以我应该为矩阵模块创建一个show方法,以便逐行显示矩阵。现在他们给了我一个开始的模块,但我不知道它意味着什么,发送它的人并没有真正解释它。我是Haskell的新手,我之前从未使用过函数式语言。如果有人能就这个模块的工作原理做一些澄清,我会很感激。

这是我应该使用的矩阵模块:

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

现在我想,但我不知道,fillWith函数会创建矩阵。我还认为Mat ((Int,Int,), (Int,Int) -> a采用一对值,很可能是行数和列数。我不确定第二对值是什么或a是什么。我还不确定fillWith (n,m) k = Mat ((n,m), (\(_,_) -> k))这是做什么的,除了它说fillWith的结果等于Mat构造函数,但后来为(\(_,_) -> k))这是什么。我所知道的是lambda是用来定义一个匿名函数,但为什么这些空格是空的,为什么k被引用为函数。我真的想学习haskell,如果有人也知道任何我喜欢它的教程。

基本上,如果我发现Matrix是由哪个组成的,我可以想出一种打印其内容的方法。我假设Matrix基本上是一个多维数组,但我真的无法保证诚实。

1 个答案:

答案 0 :(得分:1)

似乎Matrix由一个大小和一个函数组成,该函数接受一个坐标并返回该坐标处的值。

据推测,fillWith创建了一个矩阵,其中 all 元素是相同的。这就是lambda函数忽略坐标(下划线的含义)并始终返回k(数组将填充的值)的原因。

您可以看到at函数返回给定坐标对的元素。 (但它首先检查坐标是否有效。)通过构造一个调用at来获取每个元素的循环,您应该能够打印出矩阵内容。

相关问题