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]]吗?还是我必须使用来遍历单元格?
Repa 不允许您在任何特定方向上折叠,因为在并行计算期间:
\n\n\n\n\n\n
foldAllP:运营商的应用程序任意关联。
另一方面,顺序折叠不应该限制累加器与数组元素的类型相同,但不幸的是,情况也是如此foldAllS.
有一个非常简单的解决方法,即使用底层向量包将 repa 数组转换为未装箱向量toUnboxed,然后简单地使用向量包功能。显然,这意味着折叠不会并行完成,但它仍然比使用列表快得多。例子:
\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\nRun Code Online (Sandbox Code Playgroud)\n