如何将Repa数组折叠成任意值?

时间:2015-11-02 04:12:34

标签: haskell repa

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

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

1 个答案:

答案 0 :(得分:0)

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

  

foldAllP:运算符的应用程序是任意关联的。

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

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

λ>  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