我有这个功能:

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在这里真的很破事吗?

最佳答案


unsafePerformIO在这里破坏了事情。在GHC中,undefined只会引发一个异常,而不是永远循环(这将无济于事)。异常并不意味着要被纯(非IO)代码捕获-实际上,类型系统确实阻止了您尝试太多。

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

10-06 02:45