有没有办法如何有效地从IOArray
或MArray
构建切片(子数组视图)?也就是说,采用相同的数组,只是限制边界。签名可以是
(MArray a e m, Ix i) => a i e -> i -> i -> m (a i e)
例如,获取具有边界(1,1000)
的数组并创建一个视图,该视图仅允许访问具有原始数组的边界(500,700)
的元素。我搜索了文档但我找不到任何这样的功能。
答案 0 :(得分:5)
考虑到如何实现数组类型,这不是一个真正成为数组特征的东西,这可能就是为什么这些行中没有任何东西已存在。
回想一下,数组是一个连续的内存块,因此在某种程度上,每个具有n
元素的数组都有(0, n-1)
的边界。但是,想要从零开始的整数以外的索引是足够常见的,Haskell提供a type class来定义任意边界并从这些边界内的元素转换为实际内存块的基于0的整数索引。
这会导致您想要做的事情有些困难,因为假设数组的边界覆盖了整个范围。因此,如果您只是创建一个使用相同内存块但不同边界的现有数组的副本,则索引不会排列 - 在您的示例中,子数组中的索引500将与原始中的索引1相同阵列。没用。
这里最简单的方法是定义自己的数组类型,它包装现有数组并存储转换索引所需的任何额外信息,以便它将自己的边界报告为较小的范围,但在包装数组中查找基于全方位。然后,您可以使用与“真实”数组相同的边界,在新创建的数组中随处使用包装的数组类型(并将所有预期的实例(& c。)赋予它)。您可以在此处执行索引所需的任何转换,因此这种方法应该推广到没有线性顺序的索引类型(例如,由元组索引的“多维”数组)。
你可能也会做一些涉及索引类型包装的事情,并给包装器版本一个奇怪的Ix
实例,它以某种方式自动翻译事物,这将允许你使用现有的数组类型。但是,如果正确地工作,那可能会更加棘手。
如果不改变数组或索引类型,我认为没有办法做到这一点。