我该如何在Haskell中获取子数组?
ixmap newBounds trans backingArray
将返回带有界限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'
这里我们说,新数组ellArray
的索引从0
到2
。我们的索引转换很简单,只需加一(succ
),因为我们想要将索引范围[0..2]
映射到原始的helloWorldArray
中的[1..3]
。
当然,ixmap
足够抽象,可以捕获任何索引变换:甚至可以将二维数组视为一维数组,反之亦然。最好将其看作是创建对数组数据的“视图”,而不是“子数组”函数。
更多示例可在此处查看:http://zvon.org/other/haskell/Outputarray/ixmap_f.html
我没有找到直接获取子数组(即切片)的方法,但这里有一种通过中间列表实现的方式。
import Data.Array
subArray :: Int -> Int -> Array -> Array
subArray i j a = listArray (0,j-i) $ map (a!) [i..j]
newArray_ (0,x) :: IO (IOArray Int Sub)
:-PnewArray_ (0,x) :: IO (IOArray Int Sub)
:-P - sclv