3

ST モナドのSTRefはどのくらい厳密ですか? STRef に何かを書き込んだ場合、スペース リークなしで完全に評価されると確信できますか?

4

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