2012-12-07 5 views
10

shown in this answersequndefinedは、等価推論の場合には非常に奇妙なことを行います。たとえば、どのモナドも失敗する可能性があります。別の例はthis questionです。`` seq`と比較して `evaluate`は安全ですか?

最近、私は同様のことをするevaluate :: a -> IO aを見つけました。WHNFの引数を評価しますが、これはIOアクションが評価されたときだけです。これは "IOですべてをやることができる"と予想しているので、はるかに安全なようです。もちろん、どこでも使用することはできませんが、しばしば式を評価する必要性はIOオペレーション(何らかの理由で、MVarで作業するときに消費スレッドではなく計算を評価するように)接続されます。

だから私は、どのように安全であるか質問したいと思いますevaluate?例を作成することは可能ですか(IOが当然含まれます)、seqのようなコードについての推論が破られますか?または、それをseq(特定のプログラムで可能な場合)の安全な代替品と見なすことはできますか?

答えて

5

evaluateの最初の引数で使用されているモナドのモナド規則が壊れてしまうという点で、seqコマンドでも同じ問題が発生します。 ertesの答えでルールを、それをオフに基づか:クライスリ圏で

モナドはreturnを生じさせることは アイデンティティ射と(<=<)が組成物です。だから、return(<=<)ため アイデンティティである必要があります。これは、あなたがプログラムの動作を変更することなく、任意の有効なモナドでxreturn <=< xを交換することができるはずです意味

return <=< x = x 

evaluate機能とその使い方を

...

evaluate (return <=< undefined :: a -> Identity b) >> putStrLn "hello" 

出力こんにちは。何を使用すると、undefinedreturn <=< undefinedを置き換えることにより、同等の文を次のようになります。

evaluate (undefined :: a -> Identity b) >> putStrLn "hello" 

ではなくPrelude.undefined例外が発生します。

これは、evaluate関数でのみ発生します。 returnのタイプシグネチャは、evaluateとまったく同じです。上のコマンドでevaluatereturnに置き換えた場合、両方のコマンドの結果アクションは同じです(出力はhello)。

関連する問題