我听说过Haskell中的各种类型的系统黑客(unsafePerformIO,模板Haskell,任意等级多态性,.)可以用来强制不同的类型,但我还没有看到显式的实现。它是怎么做的,至少在GHC?
发布于 2014-03-01 13:42:37
论unsafePerformIO
您可以使用unsafePerformIO创建顶级IORef,即可变的全局变量。如果在其中添加多态性,则会丢失类型安全性,如下所示:
myVar :: IORef a -- polymorphic ref!
myVar = unsafePerformIO $ newIORef undefined
coerce :: a -> b
coerce x = unsafePerformIO $ do
writeIORef myVar x -- write value of type a
readIORef myVar -- read value of type b基本上,forall a. IORef a类型的(非底部)值永远不存在。它的类型声明您可以使用它作为你想要的类型的可变变量,所以你可以写它假装它有一个类型,然后假装它有另一个类型。
请注意,单纯顶级IORef不会导致类型不安全,因为您只能在同一类型中写入和读取这些类型。
对其他人
更高的等级是类型安全的,AFAIK。
我也不知道模板Haskell。
类型不安全的另一个来源是用户编写的Typeable实例,因为这些实例允许您声明自己的新数据类型实际上是Int,并成功地使用cast强制执行值。
https://stackoverflow.com/questions/22114757
复制相似问题