我对为什么 REPA 函数computeP
将其结果打包在一个单子中感到困惑。它具有以下类型签名。
computeP :: (Load r1 sh e, Target r2 e, Source r2 e, Monad m) =>
Array r1 sh e -> m (Array r2 sh e)
在本教程中它说
这样做的原因是monad 给出了明确定义的序列概念,因此 computeP 强制在 monad 计算的特定点完成并行评估。
同样,堆栈溢出的这个答案指出
Repa 中的并行计算必须是 monadic 的原因部分与惰性有关,但主要与 Repa 无法处理嵌套并行性有关。Monad 的顺序属性在很大程度上解决了它[.]
问题
- 拥有这种“顺序属性”究竟意味着什么?
- monad 如何执行此操作?
例如
computeP
:没有使用哪个monad的限制,所以我可以使用identity monad。那么使用下面的函数来解包 monad 是否可以,或者这会因为它缺少这个顺序属性而产生意想不到的结果?如果可以的话,是否还需要使用 monad?import Data.Functor.Identity import Data.Array.Repa.Eval import Data.Array.Repa myComputeP :: (Load r1 sh e, Target r2 e, Source r2 e) => Array r1 sh e -> Array r2 sh e myComputeP = runIdentity . computeP
任何帮助都会很棒。