73

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

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

4

4 回答 4

49

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

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

该样式起源于 Abadi 等人,由 Cheney 和 Hinze 为 Haskell 开发,作为表示所有动态类型的包装器,Typeable该类作为 SPJ 和 Lammel 的 SYB 工作的一部分出现。


参考

  • Martín Abadi、Luca Cardelli、Benjamin Pierce 和 Gordon Plotkin,“静态类型语言中的动态类型”,ACM Transactions on Programming Languages and Systems (TOPLAS),1991。
  • James Cheney 和 Ralf Hinze,“泛型和动态的轻量级实现”,Haskell '02:2002 年 Haskell 上的 ACM SIGPLAN 研讨会论文集,2002 年。
  • Lammel、Ralf 和 Jones、Simon Peyton,“废弃样板:通用编程的实用设计模式,TLDI '03:2003 年 ACM SIGPLAN 语言设计和实现类型国际研讨会论文集,2003 年
  • Harper,2011,编程语言的实用基础。

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

20.4 无类型意味着单一类型

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

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

D = µt.t → t。

于 2011-07-06T23:06:17.997 回答
17

它是一个允许命名类型的库。如果a声明了一个类型Typeable,那么您可以使用show $ typeOf xwhere xis any value of type来获取它的名称a。它还具有有限的类型转换功能。

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

于 2011-07-06T17:33:48.473 回答
8

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

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

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

于 2011-07-06T18:58:22.297 回答
4

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

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

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

于 2011-07-06T17:40:53.110 回答