modifyIORef
の内部でエラーが発生した場合、IORef値を変更しない方法はありますか?エラーが発生した場合(Haskell)
答えて
Haskellは、PythonやJavaなどの他の言語と同じようにエラー処理を行いません。 error
関数を呼び出すと、プログラムは停止します。期間。エラーは検出されません。それをリダイレクトしたり、プログラムを再起動する方法はありません。 error
関数は例外ではなく、エラーを発生させます。ハスケルの失敗のアイデアを表現したい場合は、Maybe
とEither
のモナドを使用します。以下は、Either
モナドを使用して、必要な機能を実装する方法です。
main = do
a <- NewIORef (Right 1 :: Either String Int)
modifyIORef a (const $ Left "some execution error")
-- a now holds a "Left" value, representing an error
val <- readIORef a
-- val now holds the "Left" value
case val of
Left err -> putStrLn $ "Error: " ++ err -- prints error (if applicable)
Right val -> putStrLn $ "Result: " ++ show val -- prints value (if applicable)
EDIT: dfeuerは親切に彼のコメントで指摘したように、それはGHCのエラーを傍受する可能です。しかし、非常に特殊な状況を除いて悪い習慣とみなされるので、Maybe
およびEither
タイプを使用することがなお好ましい。
エラーコール*は 'IO'で捕捉できます。エラーを処理する方法としてはあまり適していません。 GHCの「不正確な例外」システムの一部です。標準レポートHaskellでは、あなたが言ったことは厳密に真です。 – dfeuer
これは、modifyIORef'
またはatomicModifyIORef'
を例外ハンドラにラップして行うことができます。私は一般的にそれをお勧めしません。 error
コールは、ハンドラの詳細情報ではなく、ユーザが読むための文字列を生成します。また、「純粋な」コードからスローされた例外を処理するための「不正確な例外」メカニズムは、正しく使用するためにはかなりの注意が必要です。ほとんどの場合、純粋なコードから例外をスローすることは絶対に避けてください。 ExceptT
とEither
などが役に立ちます。
「エラー」を避けるのが最善であると理解してください。しかし、もしそれを生成するライブラリがあれば? :) 'modifyIORef''はまだ純粋です。どのように私を助けることができますか? –
@KaikoKaur、それはそれをインストールする前に値を強制するので、例外をキャッチしてそこに元の値を持つことができます。しかし、なぜあなたは悪い引数でライブラリ関数を呼び出すのですか? – dfeuer
- 1. パスワードが必要な場合、Haskell - System.Processでエラーが発生する
- 2. エラーが発生した場合jboss 5.1.0
- 3. エラーが発生した場合は
- 4. 入力 '|'でhaskellエラー解析エラーが発生しました
- 5. Haskellエラー "入力時に解析エラーが発生しました"
- 6. エラーが発生した場合、Qt Creatorでデバッガがクラッシュする
- 7. Handle Socket.io NodeでEADDRINUSEエラーが発生しました。エラーが発生した場合は「OK」です
- 8. foreachループでスマートなエラーが発生した場合その他の場合
- 9. エラー/例外が発生した場合の中断の問題?
- 10. GetValue()メソッドが失敗した場合のエラーの発生
- 11. RでtryCatchエラーが発生した場合
- 12. jQueryでエラーが発生した場合... Elseステートメント
- 13. アンドロイドスタジオでこのエラーが発生した場合
- 14. SafariでJavaScriptエラーが発生した場合は、時々のみ
- 15. エラーが発生した場合のシステムコマンドの出力方法
- 16. Pythonで構文エラーが発生した場合
- 17. Jmeterでエラーが発生した場合のスクリプトの再起動
- 18. エラーが発生した場合、ブートストラップモーダルフォームは消えます
- 19. Excelでエラーが発生した場合のハンドル
- 20. PythonでNoneTypeエラーが発生した場合If条件
- 21. エラーが発生した場合のメインページの表示
- 22. エラーが発生した場合のフィールド値の保持
- 23. rootへのアプリケーションリダイレクトでエラーが発生した場合
- 24. ResponseExceptionが発生した場合
- 25. javax.xml.ws.soap.SOAPFaultExceptionが発生した場合
- 26. 約束、エラーが発生した場合は 'then'を発しません。
- 27. HaskellのHaskellで "ERROR-C stack overflow"が発生しました
- 28. Parsecそれが見つかった場合にエラーが発生しました
- 29. エラー:haskellの `:: '入力で解析エラーが発生しましたか?
- 30. ストーリーボードで競合が発生した場合、Xcodeがクラッシュする
'error'は、例外的な日常的な状況ではなく、すべてを停止させるべきエラーです。 Cの 'assert'マクロに似ています。 – NovaDenizen
特に 'IORef'とは関係ありません。' modifyIORef'を呼び出す前に 'evaluate'や' deepSeq'(実際に必要なものに依存します)で値を強制するだけです。強制式の結果が例外になる場合は、 'modify <..>'への呼び出しには決して達しません。 – user2407038