背景
我更多地使用repa作为“管理”工具。我通过reactive-banana的AddHandlers在Array:Array D DIM2 (AddHandler Bool)中传递。
目前,我正在使用这一技术:
mapMArray :: (Monad m, R.Source r a, R.Shape sh) => (a -> m b) -> Array r sh a -> m (Array D sh b)
mapMArray f a = do
l <- mapM f . R.toList $ a
return $ R.fromFunction sh (\i -> l !! R.toIndex sh i)
where sh = R.extent a所以我可以做这样的事:
makeNetworkDesc :: Frameworks t => Array D DIM2 (AddHandler Bool) -> Moment t ()
makeNetworkDesc events = do
-- inputs
aes <- mapMArray fromAddHandler events
-- outputs
_ <- mapMArray (reactimate . (print <$>)) aes问题
是否有理由在repa中不包括这一点?
发布于 2014-09-17 12:59:33
基本上,出于同样的原因,没有什么能像 in parallel那样:mapM和mapM_ (或一般的一元操作)破坏并行性。下面是一个简单的例子:
next :: State Int Int
next = modify (+1) >> get现在,假设的repaMapM需要对State单体中的所有步骤进行排序,如果要使用repaMapM (const next)的话。由于这显然不符合并行性(而且还可能导致低性能),所以它不是repa的一部分。毕竟,在repa的描述中,高性能和并行性就在这里(强调我的描述):
Repa提供了高性能、规则的、多维的、形状多态的并行阵列.
https://stackoverflow.com/questions/25890459
复制相似问题