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