Arrays 如何在二维数组Haskell中创建setter
我当前有一个2D数组声明为:Arrays 如何在二维数组Haskell中创建setter,arrays,haskell,setter,Arrays,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
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')]
您可以使用(!)
访问特定元素:
要使用
lens
访问阵列的各个元素,您需要使用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'
请注意,如果数组很大,那么像这样编辑数组是非常低效的;如果您需要高速或大量的数组编辑,您可能需要考虑不同的结构。
粉碎数组平面的最简单方法是
Data.array.unbox
或Data.Foldable
中的elems
函数。如果它们给你的是横向的,你可能可以用ixmap
来修补它。你可能想看看中的Ixed
类。谢谢,我现在就来看看。Control.Lens.at似乎用于列表,而不是数组。不幸的是,它可以用于很多事情,但你需要Ixed
,文档中的示例可能会显示列表,但还有许多其他实例,包括数组。看看类定义下面的实例列表。不幸的是,我得到的不在范围内:^?
也许你指的是其中之一:
^(从Prelude导入),^^(从Prelude导入)
statement@anon,这是在别处定义的;如果导入Control.Lens
,您将得到它和Ixed
。最终错误(我希望)let绑定中的解析错误:中缺少必需的“
我相信这只是因为我在使用let
@anon绑定值时做了一些愚蠢的事情,这是GHCi会话的一部分,它以不同的方式处理let
。在一个模块中,您只需编写fooArray'=fooArray&ix(1,2)~'t'
(最好在上面有一个类型签名),并省去let
。这就解决了问题,非常感谢您的时间和患者!
> fooArray ^? ix (1,2)
Just 'f'
> let fooArray' = fooArray & ix (1,2) .~ 't'
> fooArray' ^? ix (1,2)
Just 't'