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

次のモナドインスタンスがあります。

instance Monad Eval where
  return x = Done x
  Done x >>= k = k x   -- Note: pattern 'Done x' makes '>>=' strict

バインドの定義のコメントに注意してください。なぜこのコメントは本当ですか?厳密性についての私の理解は、関数はその引数について「何かを知っている」必要がある場合にのみ厳密であるということです。ここで、bindはkをxに適用するだけなので、xについて何も知る必要はないように見えます(私には)。さらに、コメントは、関数が定義される前に、パターンマッチで厳密性が「誘導」されることを示唆しています。バインドが厳密である理由を誰かが理解するのを手伝ってもらえますか?

また、Evalは単なるアイデンティティモナドのようであり、bindの定義にコメントがあるとすると、bindはほとんどすべてのMonadに対して厳密になります。これは本当ですか?

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 に答える