在Haskell中获取子数组

Rne*_*net 6 haskell

如何在Haskell中获取子数组?

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