什么是Haskell的Data.Typeable?

时间:2011-07-06 17:17:55

标签: haskell typeclass generic-programming scrap-your-boilerplate

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

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

4 个答案:

答案 0 :(得分:51)

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

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

该风格起源于Abadi等人,由Cheney和Hinze为Haskell开发,作为代表所有动态类型的包装,Typeable类出现在SPJ和Lammel的SYB工作中。< / p>


参考


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

  

20.4无类型意味着Uni-Typed

     

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

     

关键的观察是无类型λ-calculus是   真的是 uni-typed λ-calculus!这不是缺席   赋予它力量的类型,而不是它具有的力量   只有一种类型,即递归类型

     

D =μt.t→t。

答案 1 :(得分:19)

这是一个允许命名类型的库。如果声明a类型Typeable,则可以使用show $ typeOf x获取其名称,其中x是类型a的任何值。它还具有limited type-casting

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

答案 2 :(得分:9)

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

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

我确信有很多介入的历史,这里有人可以加入!

答案 3 :(得分:5)

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

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

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