[英]How to make setters in 2D Array Haskell
我目前有一个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
访问数组的各个元素,您需要使用Control.Lens.At
定义的Ixed
类的ix
方法。 如果您定义
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
从功能Data.Array.Unboxed
或toList
从Data.Foldable
。 如果这些给您的是横向的,则可以使用ixmap
对其进行ixmap
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.