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

Ana*_*Ana 5 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
Run Code Online (Sandbox Code Playgroud)

我想将repa数组折叠成可以传递给GUI库以呈现的数据结构,即任意值,但是我找不到库中的函数来执行此操作。这个功能存在[... | x <- [0..w-1], y <- [0..h-1]]吗?还是我必须使用来遍历单元格?

leh*_*ins 0

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

\n\n
\n

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

\n
\n\n

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

\n\n

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

\n\n
\xce\xbb>  import qualified Data.Vector.Unboxed as V\n\xce\xbb> :t V.foldr\nV.foldr :: Unbox a => (a -> b -> b) -> b -> Vector a -> b\n\xce\xbb> :t V.foldl\nV.foldl :: Unbox b => (a -> b -> a) -> a -> Vector b -> a\n\xce\xbb> V.foldr ((&&) . (>0.5)) True $ toUnboxed repaArray\n
Run Code Online (Sandbox Code Playgroud)\n