2014-11-14 85 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