2014-11-14 83 views
2

对于Haskell而言,我相当新,并试图改进自己,就功能语言而言。我试图创建将采取若干行和列的函数,并且产生的2D阵列如下,例如:Haskell-创建2d数组

arrayMaker :: (Int, Int) -> [[Int]] 
    -- use replicate function somehow to create each row? 

所得矩阵显示如下(5行,3列):

[[14, 15, 16], 
[13, 12, 11], 
[8, 9, 10], 
[7, 6, 5], 
[2, 3, 4]] 

注意值从最后一行开始在2处。此外,数组应该在升序行和降序行之间交替。帮助将不胜感激

+0

写一个函数'row',鉴于'i'产生的第i行。然后'map row [1..numRows]'。要做到这一点,当'i'是偶数时,你能写出一个简单的算术公式来表示'(i,j)'位置上的数字吗?当'我'是奇怪的? – chi 2014-11-14 18:00:22

+1

请注意,haskell中的[Int]不是一个数组,而是一个列表。在实践中,您通常不想使用列表来表示矩阵。 – DanielM 2014-11-14 18:16:54

回答

3

让我们先从这个例子:

rowMaker1 n k = [ n .. n+k-1 ] : rowMaker1 (n+k) k 

rowMaker1产生连续的数字组。它创建了一个无限的名单,所以我们用take限制计算元素的数量:

ghci> take 5 (rowMaker1 1 3) 
[ [1,2,3], [4,5,6], [7,8,9], [10,11,12], [13,14,15] ] 

我们也可以创建降序版本:

rowMaker2 n k = [ n,n-1..n-k+1 ] : rowMaker2 (n-k) k 

ghci> take 5 (rowMaker2 16 3) 
[[16,15,14],[13,12,11],[10,9,8],[7,6,5],[4,3,2]] 

的目标将是确定arrayMaker是这样的:

arrayMaker (nrows,ncols) = take nrows (rowMaker start ncols) 
    where start = ??? 
     rowMaker n k = ??? 

我们只需要一个rowMaker它将在升序组和降序组之间交替。

这有帮助吗?

如果您遇到问题,我在这里公布了一种可能性:http://lpaste.net/114299

+0

之类的。不知道如何将rowMaker绑定到rowMaker1和rowMaker2 – GregH 2014-11-14 18:25:06

+0

如何让'rowMaker'创建两个组 - 升序组然后降序组 - 然后通过调用自身来重复。 – ErikR 2014-11-14 18:28:26

+0

你会怎么做?递归我很糟糕,这是启动Haskell的一个重要原因。然而,我一直无法找到有关我正在使用的示例 – GregH 2014-11-14 18:30:25