5

背景

repa更多地用作“管理”工具。我在:中传递reactive-bananas 。AddHandlersArrayArray D DIM2 (AddHandler Bool)

目前我正在使用这个kludge:

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

4

1 回答 1

7

基本上出于同样的原因,没有什么像parMapM并行mapMmapM_(或一般的单子动作)破坏并行性。这是一个简单的例子:

next :: State Int Int
next = modify (+1) >> get

现在,假设repaMapM需要对 monad 中的所有步骤进行排序State,如果使用repaMapM (const next). 由于这显然违背了并行性(并且也可能导致性能低下),因此它不是 repa 的一部分。毕竟,高性能和并行性就在 repa 的描述中(强调我的):

Repa 提供高性能、规则的、多维的、形状多态的并行数组。

于 2014-09-17T12:59:33.960 回答