如何在2D Array Haskell中制作setter

时间:2015-10-13 02:46:21

标签: arrays haskell setter

我目前有一个声明为:

的二维数组
import Data.Array.Unboxed
listArray ((0,0), (9,9)) (replicate 100 'f') ∷  UArray (Int, Int) Char

我正在尝试从一组坐标(x, y)中设置一个值,该坐标存储为元组,将值更改为t,而不是f。我愚弄了镜头,然而,我没有成功。

感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

数组中最简单的update function(//),具有以下类型:

(//) :: (IArray a e, Ix i) => a i e -> [(i, e)] -> a i e 

例如:

Data.Array.Unboxed> listArray (0, 4) "abcde" // [(1, 'f')] :: UArray Int Char
array (0,4) [(0,'a'),(1,'f'),(2,'c'),(3,'d'),(4,'e')]

您可以使用(!)访问特定元素:

Data.Array.Unboxed> it ! 1
'f'

答案 1 :(得分:1)

要使用lens访问数组的各个元素,您需要使用Control.Lens.At中定义的ix类的Ixed方法。如果你定义

fooArray :: UArray (Int, Int) Char
fooArray = listArray ((0,0), (9,9)) (replicate 100 'f')

然后,启动GHCi,

> fooArray ^? ix (1,2)
Just 'f'
> let fooArray' = fooArray & ix (1,2) .~ 't'
> fooArray' ^? ix (1,2)
Just 't'

请注意,如果数组很大,那么编辑这样的数组效率非常低;如果您需要高速或大量的阵列编辑,您可能需要考虑不同的结构。

粉碎数组平面的最简单方法是来自elems的{​​{1}}函数或来自Data.Array.Unboxed的{​​{1}}。如果那些给你的东西是横向的,你可以用toList修补它。