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 只是将 k 应用于 x,因此(对我而言)似乎不需要了解有关 x 的任何信息。此外,评论表明在模式匹配中“诱导”了严格性,甚至在定义函数之前。有人可以帮我理解为什么绑定是严格的吗?
此外,看起来 Eval 只是身份 Monad,并且鉴于 bind 定义中的注释,对于几乎所有 Monad,bind 都是严格的。是这样吗?