ST モナドのSTRefはどのくらい厳密ですか? STRef に何かを書き込んだ場合、スペース リークなしで完全に評価されると確信できますか?
2 に答える
6
これは、自分で簡単にテストできる種類のものです。
Prelude Data.STRef Control.Monad.ST> :{
| runST $ do
| newSTRef (error "strict!")
| return "not strict!"
| :}
"not strict!"
于 2012-12-30T00:34:36.610 に答える
6
モナド自体は、ST
厳密なイベント順序を強制するという点で厳密です。直感的には、評価runST
すると、メモリからのすべての読み取りと書き込みが「完了するまで」、情報を取得できません。しかし、厳格さを強制することになると、それはそれについてです。たとえば、STRef
デフォルトでは遅延しています (厳密なバージョンが存在します)。次のような厳格さを回復したい場合があります
writeSTRef r $! 7
スペースリークの回避に関しては...これはより複雑な問題です。正しいモナドを使うだけでは十分ではありません。
于 2012-12-30T00:40:03.097 に答える