2D haskell元组索引

时间:2013-10-26 02:14:31

标签: haskell ghci

我有以下元组表示Haskell中的2D矩阵  let a =[(1,2,3),(4,5,6),(7,8,9)]
如何单独访问每个索引? (例如[1] [1],[0] [1]等) 有没有更好的方法来解释haskell中的2D数组?

2 个答案:

答案 0 :(得分:2)

以下是使用标准Data.Array模块创建和索引不可变2D数组的示例:

Prelude> import Data.Array
Prelude Data.Array> let a = array ((0,0),(2,2)) [((i,j),3*i+j)| i <- [0..2], j <- [0..2]]
Prelude Data.Array> a ! (1,1)
4

可以找到更多信息on the Haskell Wiki

答案 1 :(得分:1)

如果你要做很多事情 - 使用矩阵,数组等等 - 那么最好遵循米哈伊尔的一个建议。

如果你只是对如何做到这一点感到好奇,那么它基本上归结为模式匹配。您可以做的一件事是使用!!函数从列表中获取零索引元素(在本例中为行),然后您必须模式匹配以从元组中获取特定元素。

例如,在以下代码中,getRow使用!!获取特定行,然后getElem返回特定元组元素,因此最终getElem a 1 1 == 5 。你当然必须添加一些代码来处理越界索引:

getRow :: [(Integer, Integer, Integer)] -> Int -> (Integer, Integer, Integer)
getRow matrix row = matrix !! (row :: Int)

getElem :: [(Integer, Integer, Integer)] -> Int -> Int -> Integer
getElem matrix row column
  | column == 0 = x
  | column == 1 = y
  | column == 2 = z
  where (x, y, z) = getRow matrix row