1

内部でエラーが発生した場合、IORef 値を変更しない方法はありますmodifyIORefか?

import Data.IORef

main = do
  a <- newIORef (1::Int)

  -- a keeps error now, not Int
  modifyIORef a (const $ error "Error forever")

  val <- readIORef a  -- val is error now
  putStrLn $ "Result: " ++ show val -- throws error
4

2 に答える 2

2

modifyIORef'これは、例外ハンドラーを使用するかatomicModifyIORef'、例外ハンドラーでラップできると思います。一般的にはお勧めしません。error呼び出しは、ハンドラーの詳細情報ではなく、ユーザーが読み取る文字列を生成します。また、「純粋な」コードからスローされた例外を処理するための「不正確な例外」メカニズム全体を正しく使用するには、かなりの注意が必要です。ほとんどの場合、純粋なコードから例外をスローしないようにする方がよいでしょう。ExceptTなどEitherを助けることができます。

于 2016-05-06T17:27:10.777 に答える