好吧,所以我应该为矩阵模块创建一个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基本上是一个多维数组,但我真的无法保证诚实。
答案 0 :(得分:1)
似乎Matrix
由一个大小和一个函数组成,该函数接受一个坐标并返回该坐标处的值。
据推测,fillWith
创建了一个矩阵,其中 all 元素是相同的。这就是lambda函数忽略坐标(下划线的含义)并始终返回k
(数组将填充的值)的原因。
您可以看到at
函数返回给定坐标对的元素。 (但它首先检查坐标是否有效。)通过构造一个调用at
来获取每个元素的循环,您应该能够打印出矩阵内容。