首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Haskell执行“未受安全保障的企业”

在Haskell执行“未受安全保障的企业”
EN

Stack Overflow用户
提问于 2014-03-01 13:05:03
回答 1查看 670关注 0票数 6

我听说过Haskell中的各种类型的系统黑客(unsafePerformIO,模板Haskell,任意等级多态性,.)可以用来强制不同的类型,但我还没有看到显式的实现。它是怎么做的,至少在GHC?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-01 13:42:37

论unsafePerformIO

您可以使用unsafePerformIO创建顶级IORef,即可变的全局变量。如果在其中添加多态性,则会丢失类型安全性,如下所示:

代码语言:javascript
复制
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强制执行值。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22114757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档