Control.Parallel.Strategies中Eval的bind运算符如何严格评估其参数?

Ben*_*ley 2 haskell strictness

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
Run Code Online (Sandbox Code Playgroud)

其中有以下Monad实例:

instance Monad Eval where
  return x = Done x
  Done x >>= k = k x   -- Note: pattern 'Done x' makes '>>=' strict
Run Code Online (Sandbox Code Playgroud)

请注意bind定义中的注释.为什么这个评论是真的?我对严格性的理解是,如果一个函数必须"知道"它的论点,那么它就是严格的.这里,bind只是将k应用于x,因此它(对我来说)不需要知道关于x的任何信息.此外,评论表明,在甚至定义函数之前,在模式匹配中"引发"严格性.有人能帮助我理解为什么绑定是严格的吗?

此外,看起来Eval只是Monad的身份,并且鉴于bind的定义中的注释,bind几乎对任何Monad都是严格的.是这样的吗?

Chr*_*icz 7

与Identity Monad不同,m >> n评估是严格的m:

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
Run Code Online (Sandbox Code Playgroud)

m产生的价值并不严格,这就是你所指出的:

Prelude Control.Parallel.Strategies Control.Monad.Identity> runEval (return undefined >> return "end") 
"end"
Run Code Online (Sandbox Code Playgroud)