gpt4 book ai didi

arrays - 切片 IOArray(或一般的 MArray)

转载 作者:行者123 更新时间:2023-12-04 19:11:46 26 4
gpt4 key购买 nike

有没有一种方法可以有效地从 IOArray 中构造切片(子阵列 View )? , 或 MArray 一般来说?也就是说,取同一个数组,只是限制边界。签名可以是

(MArray a e m, Ix i) => a i e -> i -> i -> m (a i e)

例如,取一个有边界的数组 (1,1000)并制作一个仅允许访问具有边界的元素的 View (500,700)的原始数组。我搜索了文档,但找不到任何此类功能。

最佳答案

考虑到数组类型是如何实现的,这并不是数组真正的特性,这可能就是为什么这些方面已经不存在的原因。

回想一下,数组是一个连续的内存块,所以在某种程度上,每个数组都有 n元素有界限 (0, n-1) .然而,想要从零开始的整数以外的索引是很常见的,Haskell 提供了a type class。用于定义任意边界并将这些边界内的元素转换为实际内存块的基于 0 的整数索引。

这会给您想要做的事情带来一些困难,因为假设数组的边界覆盖了它的整个范围。因此,如果您要简单地创建使用相同内存块但边界不同的现有数组的副本,则索引不会对齐 - 在您的示例中,子数组中的索引 500 将与原始数组中的索引 1 相同大批。没有帮助。

这里最简单的方法是定义您自己的数组类型,该数组类型包装现有数组并存储转换索引所需的任何额外信息,以便它将自己的边界报告为较小的范围,但根据全系列。然后,您可以在任何地方使用包装的数组类型(并为其提供所有预期的实例等),只需使用与“真实”数组相同的边界即可。您可以在此处对索引执行所需的任何转换,因此这种方法应该推广到也没有线性顺序的索引类型(例如,由元组索引的“多维”数组)。

您可能还可以做一些涉及围绕您的索引类型的包装器并给包装器版本一个奇怪的 Ix以某种方式自动翻译事物的实例,这将允许您使用现有的数组类型。不过,要正确工作可能会更棘手。

我认为没有任何方法可以在不更改数组或索引类型的情况下做到这一点。

关于arrays - 切片 IOArray(或一般的 MArray),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14305496/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com