Haskell Repa slice 函数有类似Vector等语言的用法吗?

Is there usage of Haskell Repa slice function analogous to Vector and other languages?

我正在尝试在 Haskell 中获得多维数组的可用版本,与 Python 和其他语言中的 numpy 数组相当。 我发现了其他关于如何为特定维度的数组编写自定义函数的问题,但我的 objective 更重要的是,获得了与 Data.Vectorslice 函数类似的行为,即直观并完成其他语言的括号索引数组的工作。

Vectorslice 函数有类型 V.slice :: Int -> Int -> V.Vector a -> V.Vector a

所以切片向量 v 就像

一样简单
import Data.Vector as V
let v = V.fromList [1..10]
    i = 1
    j = 5
V.slice i j v
另一方面,

Repaslice 具有类型

R.slice :: (R.Slice sl, R.Shape (R.FullShape sl), R.Source r e) => R.Array r (R.FullShape sl) e -> sl -> R.Array R.D (R.SliceShape sl) e

所以它需要一个 Repa 数组和一个形状,return 一个延迟数组。 我知道 Repa 不会将整数作为索引,但我正在寻找 slice 函数在任意维度上的一般用途,无论是使用 Repa(Z :. i) 还是 ixn 尺寸规格。

我不是在寻找使用 traverse 的维度相关函数,并且不希望进入任何模板 haskell 来概括它,尽管如果无法使用 slice 功能一般就是这样。

那么问题是:是否可以使用 Repaslice 函数来获取多维数组的任意切片,例如 numpy 的 v[x1:x2 ,y1:y2] 或 C++ Eigenmatrix.block<p,q>(i,j)?

我认为最接近的等价物是 extract,它有一个起始索引(如 ix2 x1 y1)和一个大小(如 ix2 (x2-x1) (y2-y1))。

extract 的结果始终具有与输入相同的维数,但每个维的大小可以不同。 slice 的结果可以有不同数量的维度,但在任何给定的维度中,它要么接受所有元素,要么只接受一个元素。 (基于 ShapeSlice 的实例。)