2

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 都是严格的。是这样吗?

4

1 回答 1

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

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

Prelude Control.Parallel.Strategies Control.Monad.Identity> runEval (return undefined >> return "end") 
"end"
于 2012-08-06T15:56:03.800 回答