我遇到了对 Haskell's 的引用Data.Typeable
,但我不清楚为什么要在我的代码中使用它。
它解决了什么问题,如何解决?
我遇到了对 Haskell's 的引用Data.Typeable
,但我不清楚为什么要在我的代码中使用它。
它解决了什么问题,如何解决?
Data.Typeable
是一种众所周知的方法(参见 Harper)的编码,用于在静态类型语言中实现延迟(动态)类型检查 - 使用通用类型。
这种类型包装了类型检查直到稍后阶段才会成功的代码。编译器不会将程序作为错误类型拒绝,而是将其传递给运行时检查。
该样式起源于 Abadi 等人,由 Cheney 和 Hinze 为 Haskell 开发,作为表示所有动态类型的包装器,Typeable
该类作为 SPJ 和 Lammel 的 SYB 工作的一部分出现。
参考
即使在教科书中:动态类型(具有可类型表示)是只有一种类型的静态类型语言,Harper ch 20:
20.4 无类型意味着单一类型
无类型的 λ 演算可以忠实地嵌入到具有递归类型的类型语言中。这意味着每个无类型的 λ-term 都有一个作为类型化表达式的表示,这样一个 λ-term 的表示的执行对应于该术语本身的执行。这种嵌入不是为 ℒ{+×⇀µ} 中的 λ-演算编写解释器(我们当然可以这样做),而是将非类型化 λ-项直接表示为具有递归类型的语言中的类型化表达式.
关键的观察是无类型的λ-演算实际上是单类型的λ-演算!赋予它强大的不是类型的缺失 ,而是它 只有一种类型,即递归类型
D = µt.t → t。
它是一个允许命名类型的库。如果a
声明了一个类型Typeable
,那么您可以使用show $ typeOf x
where x
is any value of type来获取它的名称a
。它还具有有限的类型转换功能。
(这有点类似于 C++ 的 RTTI 或动态语言的反射。)
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
我敢肯定这里有很多人可以参与其中的历史!
Data.Typeable类主要用于Scrap Your Boilerplate (SYB) 风格的泛型编程。另请参阅Data.Data
这个想法是 SYB 定义了一个集合组合器,用于在各种用户创建的类型上以统一的方式执行诸如打印、计数、搜索、替换等操作。类型类提供了必要的Typeable
管道。
在现代 GHC 中,您可以deriving Data.Typeable
在定义自己的类型时说出来,以便为其提供必要的实例。