如何在2D数组Haskell中制作setter



我目前有一个2D数组声明为:

import Data.Array.Unboxed
listArray ((0,0), (9,9)) (replicate 100 'f') ∷  UArray (Int, Int) Char

我试图从一组坐标中设置该数组中的值,(x, y)存储为元组,将值更改为t,而不是f。我曾经摆弄过镜片,但是,我没有成功。

任何帮助都是感激的!

最简单的数组更新函数是(//),它具有以下类型:

(//) :: (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'

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

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'

注意,如果数组很大,像这样编辑数组是非常低效的;如果你需要高速或大量的数组编辑,你可能需要考虑一个不同的结构。

将数组平放的最简单方法是使用Data.Array.Unboxed中的elems函数或Data.Foldable中的toList函数。如果这些给你的是横向的,你可能可以用ixmap来修补它。

最新更新