gpt4 book ai didi

haskell - `unsafeCoerce` Haskell 中的实现

转载 作者:行者123 更新时间:2023-12-02 18:41:10 24 4
gpt4 key购买 nike

我听说 Haskell 中的各种类型系统 hack(unsafePerformIO、Template Haskell、任意等级多态性...)可用于强制不同的类型,但我还没有看到显式的实现。至少在 GHC 中是如何做到的?

最佳答案

关于 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

基本上,所有 a 的类型为 的(非底部)值。 IORef a 永远不应该存在。它的类型表明您可以将其用作所需类型的可变变量,因此您可以向它写入,假装它具有一种类型,然后从它读取,假装它具有另一种类型。

请注意,单态顶级 IORef 不会导致类型不安全,因为您只能以相同类型写入和读取它们。

关于其他

据我所知,更高的排名是类型安全的。

我也不了解 Template Haskell。

类型不安全的另一个来源是用户编写的 Typeable 实例,因为这些实例允许您声明自己的新数据类型实际上是 Int 并成功使用 cast 强制值。

关于haskell - `unsafeCoerce` Haskell 中的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22114757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com