5

Repa的所有归约函数都折叠回与数组内容相同的类型。例如:

foldAllP :: (Shape sh, Source r a, Elt a, Unbox a, Monad m) => (a -> a -> a) -> a -> Array r sh a -> m a
foldAllS :: (Shape sh, Source r a, Elt a, Unbox a) => (a -> a -> a) -> a -> Array r sh a -> a

我想将 repa 数组折叠成一个数据结构,我可以将其传递给 GUI 库进行渲染,即任意值,但我在库中找不到执行此操作的函数。这个函数是否存在或者我必须使用迭代单元格[... | x <- [0..w-1], y <- [0..h-1]]

4

1 回答 1

0

Repa 不允许您在任何特定方向上折叠,因为在并行计算期间:

foldAllP:运营商的应用是任意关联的。

另一方面,顺序折叠不应限制累加器与数组元素的类型相同,但不幸的是,情况也是如此foldAllS

通过回退到底层向量包有一个非常简单的解决方法,即使用将 repa 数组转换为未装箱的向量toUnboxed,然后简单地使用向量包功能。这显然意味着折叠不会并行完成,但它仍然比使用列表快得多。例子:

λ>  import qualified Data.Vector.Unboxed as V
λ> :t V.foldr
V.foldr :: Unbox a => (a -> b -> b) -> b -> Vector a -> b
λ> :t V.foldl
V.foldl :: Unbox b => (a -> b -> a) -> a -> Vector b -> a
λ> V.foldr ((&&) . (>0.5)) True $ toUnboxed repaArray
于 2016-03-14T10:50:51.660 回答