繁体   English   中英

如何在2D阵列Haskell中进行二传手

[英]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.UnboxedtoListData.Foldable 如果这些给您的是横向的,则可以使用ixmap对其进行ixmap

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM