fat*_*oku 10
我认为你正在寻找的是Data.Array文档中的' 派生数组 '部分:http://hackage.haskell.org/packages/archive/array/latest/doc/html/Data-Array.html#5 其功能包括:
ixmap ::(Ix i,Ix j)=>(i,i) - >(i - > j) - >数组je - >数组ie
ixmap允许对数组索引进行转换.它可以被认为是在右边提供原始数组所体现的映射的函数组合.
可以使用Functor类的Array实例>中的fmap实现类似的数组值转换.
以下代码:
ixmap newBounds trans backingArray
Run Code Online (Sandbox Code Playgroud)
将返回带有边界的数组newBounds
,当索引时!i
,索引转换函数在用于索引i
之前应用于索引backingArray
.
例如,如果您有数组"Hello World"(下面的helloWorldArray),并且您只想将"ell"视为派生的从零开始(子)数组:
> let helloWorldArray = listArray (0,length str - 1) str -- 0-based array
where str = "Hello World"
> let ellArray = ixmap (0,2) succ helloWorldArray -- also 0-based array
> ellArray ! 0
'e'
> ellArray ! 1
'l'
> ellArray ! 2
'l'
Run Code Online (Sandbox Code Playgroud)
在这里,我们说,我们的新阵列ellArray
具有指数从0
通过2
.我们的索引转换只是添加一个(succ
),因为我们想要将索引范围映射[0..2]
到[1..3]
原始索引helloWorldArray
.
当然,ixmap
抽象足以捕获任何索引转换:甚至将2维数组视为1维数组,反之亦然.最好将其视为在数组数据上创建"视图" 而不是"子数组"函数.
有关更多示例,请参阅此处:http://zvon.org/other/haskell/Outputarray/ixmap_f.html