2

I have this function:

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

then:

isUndefined () = False
isUndefined undefined = True

Solving the halting problem. Of course, this can be extended to other types too.

My question: how is this possible? Is Control.Exception.try really breaking things here?

4

1 回答 1

8

Control.Exception.try 真的在这里破坏了吗?

unsafePerformIO正在破坏这里的东西。在 GHC 中,undefined只是引发异常而不是永远循环(这将无济于事)。异常并不意味着在纯(非 IO)代码中被捕获——事实上,类型系统确实阻止了您尝试尽可能多的尝试。

通过使用unsafe*函数,您是在告诉 GHC “忽略一切,我知道我在做什么”,并且所有安全带现在都已关闭。帮自己一个忙,假装这些unsafe*东西不存在。

于 2015-06-20T21:29:10.640 回答