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