- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对为什么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)
The reason for this is that monads give a well defined notion of sequence and thus computeP enforces completion of parallel evaluation in a particular point of monadic computations.
The reason why parallel computation in Repa must be monadic has to do partially with lazyness, but mostly with Repa's inability to deal with nested parallelism. Sequential property of a Monad solves it for the most part[.]
computeP
的示例:使用哪个monad不受限制,因此我可以使用身份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
最佳答案
这种单子(monad)约束是一种启发式技巧。它可以帮助有纪律的用户避免嵌套的并行性,但对恶意或无知的用户则无济于事。
嵌套并行性是一种情况,当您并行计算某个数组时,最终不得不并行计算另一个数组。 Repa不支持它(原因并不重要),因此它尝试避免它。computeP
的类型有助于确保并行计算彼此之间按顺序进行,但绝不能气密。它仅仅是“尽力而为”的抽象。
How does a monad enforce this?
computeP
仅应与绑定(bind)
(>>=)
的第一个参数严格的monad一起使用,因此在
u >>= k
中,仅在对
k
求值之后,才会应用
u
函数。然后,如果您将
computeP
与此类monad一起使用,
do w <- computeP v
k w
w
传递给
k
之前已对其进行了评估,这可以安全地执行其他
computeP
操作。
IO
,严格State
,Maybe
,[]
。 Identity
,惰性State
,Reader
。 (可以使严格的monad严格,但不能相反。特别是,如果只想进行Repa计算,则可以定义严格的身份monad。)computeP
的类型有意使其在可能并行执行的操作(例如带有非单函数的
map :: (a -> b) -> Array _ _ a -> Array _ _ b
和
fromFunction :: sh -> (sh -> a) -> Array _ _ a
)中使用很麻烦。仍然可以显式解开
computeP
,例如,您注意到
runIdentity
:您可以随意射击自己的脚,但是要抬起枪支,将其指向下方并扣动扳机。
What does having this 'sequential property' mean exactly?
(>>=)
的定义自然会规定求值顺序,通常是因为它立即在第一个参数上进行模式匹配。如前所述,这是Repa用来强制按顺序执行
computeP
计算的原因(这就是为什么如果将其专门用于
Identity
,它会中断的原因;这不是严格的monad)。在总体方案中,这是惰性评估的一个相当小的细节,而不是通常适合于单子(monad)的任何事物。
关于Haskell:并行计算和monads的 'sequential property',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59586452/
monad 被定义为类别 C 上的内仿函数。假设 C 具有类型 int 和 bool 以及其他构造类型作为对象。现在让我们考虑在这个类别上定义的列表 monad。 根据它的定义,list 是一个内仿函
我试图采取例如ExceptT a (StateT A M) , 对于某些具体类型 A和单子(monad)M ,并将它们包装到我的新自定义单子(monad)中。 首先我确定StateT A M经常出现在
我读到(例如 here 和 here )所有基本单子(monad)(Mabye, Error, ...) 源自其相应的 monad 转换器(MaybeT, ErrorT, ...) 使用身份 mona
Haskell 的状态单子(monad) State s a迫使我保持相同类型的 s在整个做 block 期间。但是由于 state monad 实际上只是一个函数,如果我将它定义为 State
我一直在阅读some materials on free monads而且我真的不认为我离实现更近了,但我认为我更接近于理解它们是什么! 鉴于上述大量资源,我的理解是自由单子(monad)从“计算”工
假设我有一个由两个 monad 操作组成的函数: co::Monad m => m a -> m a -> m a 您可以将 co 视为一个高阶函数,它描述两个单子(monad)操作如何相互协作来完成
在 SO解释了为什么像 scalaz、cats (Scala) 或 Arrow (Kotlin) 中的 Validation 不能是 monad。 据我所知,这是因为他们已经根据应用仿函数对 mona
我对 Haskell 还很陌生,并且慢慢地意识到 Monad fail 的存在有问题。真实世界的 Haskell warns against its use (“再一次,我们建议您几乎总是避免使用失败
我正在阅读现实世界 Haskell 中的 monad 转换器。在以下示例中,堆栈为 Writer在顶部State在Reader之上在IO之上。 {-# Language GeneralizedNewt
我看到的典型 Pause monad 实现如下所示(基于 Giulia Costantini 和 Giuseppe Maggiore 编写的 Friendly F# 的第 5 章)。 open Sys
“Monads 允许程序员使用顺序构建 block 来构建计算”,因此它允许我们组合一些计算。如果是这样,那为什么下面的代码不能运行呢? import Control.Monad.Trans.Stat
这是我第一次认识 Monad Transformers,所以答案可能很明显。 假设我在 StateT MyMonad MyType 类型的 do 块中,我想让另一个相同类型的函数修改状态并返回 MyM
人们通常说类型是单子(monad)。 在某些函数式语言和库(如 Scala/Scalaz)中,您有一个类型构造函数,如 List 或 Option,您可以定义一个与原始类型分离的 Monad 实现。所
我的目标是创建一个函数,该函数在 ReaderT WriterT 堆栈或 RWS 堆栈中使用 list monad。更一般地说,我如何在 mtl 类型类(如 MonadReader、MonadWrit
我只是想知道是否有一个简洁的术语来表示既是单子(monad)又是单子(monad)的东西。我做了一些搜索,我知道these structures exist ,但我还没有找到他们的名字。 最佳答案 在
我正在玩写一个网络应用程序。在这种情况下,我使用 scotty和 redis ,但是这个问题出现在任何 web/db 组合中。在此之前我使用了 happstack,所以我也喜欢那里的一个例子。 Sco
是 x >>= f相当于 retract (liftF x >>= liftF . f) ? 也就是说,从同样是 Monad 的 Functor 构建的自由 monad 的 monad 实例是否将具有
我正在尝试编写一个只能包含 Num 的新 monad。当它失败时,它返回 0,就像 Maybe monad 在失败时返回 Nothing 一样。 这是我到目前为止所拥有的: data (Num a)
我正在使用 operational monad作者:海因里希·阿普菲尔姆斯。 我想用结果类型的 monad 参数化解释器。 我的代码的以下版本编译: {-# LANGUAGE GADTs #-} im
假设所有的 monad 都可以用 Free 来表示。 (如果这不是真的,什么是反例,为什么)?怎么可能the continuation monad或其对应的变压器用 Free 表示或 FreeT -
我是一名优秀的程序员,十分优秀!