Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在二维数组Haskell中创建setter_Arrays_Haskell_Setter - Fatal编程技术网

Arrays 如何在二维数组Haskell中创建setter

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

我当前有一个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')]
您可以使用
(!)
访问特定元素:


要使用
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'