如何在二维数组中制作 setter Haskell
How to make setters in 2D Array Haskell
我目前有一个二维数组声明为:
import Data.Array.Unboxed
listArray ((0,0), (9,9)) (replicate 100 'f') ∷ UArray (Int, Int) Char
我正在尝试根据一组坐标在此数组中设置一个值,(x, y)
存储为元组,将值更改为 t
,而不是 f
.镜头我也瞎折腾过,但是没有成功。
感谢任何帮助!
数组最简单的 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'
要使用 lens
访问数组的各个元素,您需要使用 Ixed
class 的 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
.
来修补它
我目前有一个二维数组声明为:
import Data.Array.Unboxed
listArray ((0,0), (9,9)) (replicate 100 'f') ∷ UArray (Int, Int) Char
我正在尝试根据一组坐标在此数组中设置一个值,(x, y)
存储为元组,将值更改为 t
,而不是 f
.镜头我也瞎折腾过,但是没有成功。
感谢任何帮助!
数组最简单的 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'
要使用 lens
访问数组的各个元素,您需要使用 Ixed
class 的 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
.