我遇到过对Haskell的Data.Typeable
的引用,但我不清楚为什么我想在我的代码中使用它。
它解决了什么问题,以及如何解决?
答案 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
,以便为其提供必要的实例。