[英]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.