2

私はこの機能を持っています:

isUndefined :: () -> Bool    
isUndefined x = case unsafePerformIO $ (try (return $! x) :: IO (Either SomeException ())) of
                    Left _ -> True
                    Right _ -> False

それから:

isUndefined () = False
isUndefined undefined = True

停止の問題を解決します。もちろん、これは他のタイプにも拡張できます。

私の質問:これはどのように可能ですか?ここで本当にControl.Exception.try物事を壊していますか?

4

1 に答える 1

8

Control.Exception.try は本当にここで何かを壊していますか?

unsafePerformIOここで物事を壊しています。GHC では、undefined永遠にループするのではなく、単純に例外を発生させます (これは役に立ちません)。例外は、純粋な (非 IO) コードでキャッチされることを意図したものではありません。

関数を使用unsafe*することで、GHC に「すべてを無視してください。自分が何をしているのかはわかっています」と伝えることになり、すべての安全ベルトがオフになります。自分に好意を持って、unsafe*ものが存在しないふりをしてください。

于 2015-06-20T21:29:10.640 に答える