【发布时间】:2020-01-03 23:17:31
【问题描述】:
我对为什么 REPA 函数 computeP 将其结果打包到一个 monad 感到困惑。它具有以下类型签名。
computeP :: (Load r1 sh e, Target r2 e, Source r2 e, Monad m) =>
Array r1 sh e -> m (Array r2 sh e)
在this tutorial 它说
这样做的原因是 monad 给出了明确定义的序列概念,因此 computeP 强制在 monad 计算的特定点完成并行计算。
同样,Stack Overflow 上的 this answer 声明
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
任何帮助都会很棒。
【问题讨论】:
-
你应该一次只关注一个问题。
-
@MichaelLitchard 我猜你的意思是
What does having this 'sequential property' mean和why does computeP pack its result in a monad这两个问题。后者实际上是作为前者的一个例子:我猜computeP因为这个顺序属性而使用monad,但我想澄清一下这个顺序属性是如何工作的。你是这个意思吗?如果您能澄清,我非常愿意澄清问题或将其拆分为多个问题。 -
真的是“这对任何单子都有效吗”/“单子令人困惑 hellppp”似乎偏离了主题,至少对我而言。但我也认为这是一个不错的问题,三个子问题很好地传达了您想要理解的内容。
-
@luqui 好的,我明白你的意思。世界不需要另一个“单子令人困惑的 hellppp”问题,我也不打算让它看起来那样。我想我希望找到一个答案,以我自己的直觉为起点来解释这个连续的事情,但它可能会偏离真正的问题。我将删除问题的最后一部分。
-
@Safron 仅供参考,massiv 在精神上与 Repa 相似,但不受您问题的限制,因此嵌套并行性完全可以。