I currently have a 2D array declared as:
import Data.Array.Unboxed
listArray ((0,0), (9,9)) (replicate 100 \'f\') ∷ UArray (Int, Int) Char
I a
The simplest update function for arrays is (//), which has this type:
(//) :: (IArray a e, Ix i) => a i e -> [(i, e)] -> a i e
For example:
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')]
You can access particular elements with (!):
Data.Array.Unboxed> it ! 1
'f'
To access individual elements of an array with lens, you need to use the ix method of the Ixed class, defined in Control.Lens.At. If you define
fooArray :: UArray (Int, Int) Char
fooArray = listArray ((0,0), (9,9)) (replicate 100 'f')
then, firing up GHCi,
> fooArray ^? ix (1,2)
Just 'f'
> let fooArray' = fooArray & ix (1,2) .~ 't'
> fooArray' ^? ix (1,2)
Just 't'
Note that editing arrays like this is pretty inefficient if the arrays are large; if you need high speed or lots of array edits, you may want to consider a different structure.
The easiest ways to smash an array flat are the elems function from Data.Array.Unboxed or toList from Data.Foldable. If what those give you is sideways, you can probably patch it up with ixmap.