'try' 可以决定程序何时停止
'try' can decide when a program halts
我有这个功能:
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
真的会破坏这里的东西吗?
Is Control.Exception.try really breaking things here?
unsafePerformIO
破坏了这里的东西。在 GHC 中,undefined
只是引发异常而不是永远循环(这将无济于事)。异常并不意味着要在纯(非 IO)代码中捕获——事实上,类型系统确实会阻止您尝试那么多。
通过使用 unsafe*
函数,您告诉 GHC "ignore everything, I know what I'm doing",所有安全带现在都已关闭。帮自己一个忙,假装 unsafe*
东西不存在。
我有这个功能:
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
真的会破坏这里的东西吗?
Is Control.Exception.try really breaking things here?
unsafePerformIO
破坏了这里的东西。在 GHC 中,undefined
只是引发异常而不是永远循环(这将无济于事)。异常并不意味着要在纯(非 IO)代码中捕获——事实上,类型系统确实会阻止您尝试那么多。
通过使用 unsafe*
函数,您告诉 GHC "ignore everything, I know what I'm doing",所有安全带现在都已关闭。帮自己一个忙,假装 unsafe*
东西不存在。