Control.Parallel.Strategies(http://hackage.haskell.org/packages/archive/parallel/3.1.0.1/doc/html/src/Control-Parallel-Strategies.html#Eval)的源代码包含一个Eval类型,定义为:
data Eval a = Done a
具有以下Monad实例:
instance Monad Eval where
return x = Done x
Done x >>= k = k x -- Note: pattern 'Done x' makes '>>=' strict
注意bind定义中的注释。为什么这个评论是真的?我对严格性的理解是,如果一个函数必须“知道”它的论点,那么函数才是严格的。这里,bind只是将k应用于x,因此它(对我来说)不需要知道关于x的任何信息。此外,评论表明,在甚至定义函数之前,在模式匹配中“引发”严格性。有人可以帮我理解为什么绑定是严格的吗?
此外,看起来Eval只是Monad的身份而且,鉴于bind定义中的注释,bind几乎对任何Monad都是严格的。是这种情况吗?
答案 0 :(得分:7)
严格意义上m >> n
评估m
,与Identity Monad不同:
Prelude Control.Parallel.Strategies Control.Monad.Identity> runIdentity (undefined >> return "end")
"end"
Prelude Control.Parallel.Strategies Control.Monad.Identity> runEval (undefined >> return "end")
"*** Exception: Prelude.undefined
m
生成的值并不严格,w就是你所指出的:
Prelude Control.Parallel.Strategies Control.Monad.Identity> runEval (return undefined >> return "end")
"end"