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

时间:2012-08-06 15:22:27

标签: 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

具有以下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都是严格的。是这种情况吗?

1 个答案:

答案 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"