今天早上我注意到一些有趣的事情,我想问一下它是否重要。
所以在 Haskell 中,未定义的语义包含非终止。所以应该不可能有功能
isUndefined :: a -> Bool
因为语义表明这解决了停机问题。
但是,我相信 GHC 的一些内置功能可以“相当可靠地”打破这种限制。特别是catch#。
以下代码允许“相当可靠地”检测未定义的值:
import Control.Exception
import System.IO.Unsafe
import Unsafe.Coerce
isUndefined :: a -> Bool
isUndefined x = unsafePerformIO $ catch ((unsafeCoerce x :: IO ()) >> return False) ((\e -> return $ show e == "Prelude.undefined") :: SomeException -> IO Bool)
另外,这真的算吗,因为您会注意到它使用了几个“不安全”的功能?
朱尔斯
编辑:有些人似乎认为我声称已经解决了停机问题 XD 我不是一个曲柄。我只是说 undefined 的语义有一个相当严重的中断,因为他们声明 undefined 的值应该在某种意义上与非终止没有区别。这个功能允许的。我只是想检查一下人们是否同意这一点以及人们对此的看法,在 Haskell 的 GHC 实现中为了方便而添加某些不安全功能的意外副作用是不是已经迈出了一步?:)
编辑:修复了要编译的代码