在Haskell中获取子数组

7
我该如何在Haskell中获取子数组?

2
你知道如何首先获得一个数组吗?你所说的是哪个数组库?Data.Vector?Data.Array?这个问题真的需要更详细说明。 - Thomas M. DuBuisson
@TomMD 数据数组的子数组。 - Rnet
1
Data.Array 相当笨拙,而且没有融合功能,我建议您在未来的数组需求中使用 Data.Vector。 - Thomas M. DuBuisson
newArray_ (0,x) :: IO (IOArray Int Sub) :-PnewArray_ (0,x) :: IO (IOArray Int Sub) :-P - sclv
不要忘记在最后接受帮助过你的答案 ;) - fatuhoku
3个回答

13
我认为你需要查看Data.Array文档中的“派生数组”部分。其中包含函数:ixmap,它允许对数组进行索引转换。这可以被认为是在原始数组所代表的映射右侧提供函数组合。你还可以使用Functor类的Array实例中的fmap来实现类似的数组值转换。
以下是示例代码:
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的索引从02。我们的索引转换很简单,只需加一(succ),因为我们想要将索引范围[0..2]映射到原始的helloWorldArray中的[1..3]

当然,ixmap足够抽象,可以捕获任何索引变换:甚至可以将二维数组视为一维数组,反之亦然。最好将其看作是创建对数组数据的“视图”,而不是“子数组”函数。

更多示例可在此处查看:http://zvon.org/other/haskell/Outputarray/ixmap_f.html


4
使用vector包获取子数组可能是最简单的方法(假设您的问题实际上不是要求获取子列表)。
通用向量/数组接口中相关的函数如下:
  • slice :: Vector v a => Int -> Int -> v a -> v a
但您还应该了解take和drop。slice需要索引和长度,并提取子数组。

2

我没有找到直接获取子数组(即切片)的方法,但这里有一种通过中间列表实现的方式。

import Data.Array

subArray :: Int -> Int -> Array -> Array
subArray i j a = listArray (0,j-i) $ map (a!) [i..j]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接