什么是 Haskell 的数据。可打字?

我偶然发现一些关于 Haskell 的 Data.Typeable的参考资料,但是我不清楚为什么要在我的代码中使用它。

它能解决什么问题,怎么解决?

7179 次浏览

这是一个允许命名类型的库。如果将类型 a声明为 Typeable,那么可以使用 show $ typeOf x获得它的名称,其中 xa类型的任何值。它还具有 有限制的类型铸造

(这有点类似于 C + + 的 RTTI 或动态语言的反射。)

数据,可打字类主要用于泛型的 废弃你的样板文件(SYB)风格

其思想是 SYB 定义了一个集合组合器,用于在各种用户创建的类型上以统一的方式执行诸如打印、计数、搜索、替换等操作。Typeable类型类提供了必要的管道。

在现代 GHC 中,为了提供必要的实例,在定义自己的类型时可以直接使用 deriving Data.Typeable

我能找到的关于 Haskell 的类 Data.Typeable库的最早描述之一是 John Peterson 在1992年写的: http://www.cs.yale.edu/publications/techreports/tr1022.pdf

我所知道的介绍实际 Data.Typeable库的最早的“官方”论文是2003年的第一篇“废弃你的样板文件”: http://research.microsoft.com/en-us/um/people/simonpj/Papers/hmap/index.htm

我相信这里有很多介入的历史可以让这里的人加入进来!

Data.Typeable是一种众所周知的方法(参见 Harper)的编码,用于在静态类型语言中实现延迟(动态)类型检查——使用 通用的类型。

这种类型包装了类型检查要到以后阶段才能成功的代码。编译器不会将程序作为病态类型拒绝,而是将其传递给运行时检查。

这种风格起源于 Abadi 等人,并由 Cheney 和 Hinze 为 Haskell 开发,作为一个包装器来代表所有的动态类型,其中 Typeable类作为 SYB 工作的一部分出现在 SPJ 和 Lammel 的作品中。


参考文献


甚至在教科书中: 动态类型(带有可打字的表示)是只有一种类型的静态类型语言,Harper ch 20:

20.4无类型表示单一类型

无类型 λ- 演算可以忠实地嵌入到 具有递归类型的类型化语言。这意味着每个 无类型 λ- 项具有类型化表达式的表示形式 以这样一种方式,执行表示的一个 Λ- 项对应于项本身的执行 嵌入是 没有的一个编写解释器的问题 L { + × something μ }中的 λ- 微积分(我们当然可以做到) ,但是 而是无类型 λ- 术语的直接表示 具有递归类型的语言中的表达式。

关键是观察到 无法打印 λ- 演算是 真正的 统一类型 λ- 微积分! 它不是 缺席 给予它力量的类型,而不是它已经 只有一种 类型,即递归类型

D = μt.t → t。