繁体   English   中英

Haskell 的 Data.Typeable 是什么?

[英]What is Haskell's Data.Typeable?

我遇到过对 Haskell 的Data.Typeable的引用,但我不清楚为什么要在我的代码中使用它。

它解决了什么问题,如何解决?

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

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

这种风格起源于 Abadi 等人,由 Cheney 和 Hinze 为 Haskell 开发,作为表示所有动态类型的包装器, Typeable class 出现在 SPJ 和 Lammel 的 SYB 工作中。


参考


即使在教科书中:动态类型(具有可类型表示)是只有一种类型的静态类型语言,Harper ch 20:

20.4 无类型意味着单一类型

无类型的 λ 演算可以忠实地嵌入到具有递归类型的类型语言中。 这意味着每个无类型的 λ-term 都有一个作为类型化表达式的表示,这样一个 λ-term 的表示的执行对应于该术语本身的执行。 这种嵌入不是为 ℒ{+×⇀µ} 中的 λ-演算编写解释器(我们当然可以这样做),而是将非类型化 λ-项直接表示为具有递归类型的语言中的类型化表达式.

关键的观察是无类型的 λ-演算实际上是单类型的λ-演算! 赋予它强大的不是类型的缺失,而是它只有一种类型,即递归类型

D = µt.t → t。

它是一个允许命名类型的库。 如果类型a被声明为Typeable ,那么您可以使用show $ typeOf x获取它的名称,其中x是类型a的任何值。 它还具有有限的类型转换功能。

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

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

我知道的最早介绍实际Data.Typeable库的“官方”论文是 2003 年的第一篇 Scrap Your Boilerplate 论文: http://research.microsoft.com/en-us/um/people/simonpj/Papers/hmap/索引.htm

我敢肯定这里有很多人可以参与其中的历史!

Data.Typeable class 主要用于Scrap Your Boilerplate (SYB) 风格的通用编程。 另请参阅Data.Data

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

在现代 GHC 中,您可以在定义自己的类型时只说deriving Data.Typeable以便为其提供必要的实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM