Haskell的Data.Typeable是什么?


Answers:


49

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

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

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


参考

  • 马丁·阿巴迪(MartínAbadi),卢卡·卡德利(Luca Cardelli),本杰明·皮尔斯(Benjamin Pierce)和戈登·普洛特金(Gordon Plotkin),“静态类型语言的动态打字”,ACM编程语言和系统交易(TOPLAS),1991年。
  • James Cheney和Ralf Hinze,“泛型和动力学的轻量级实现”,Haskell '02:2002年Haskell的2002 ACM SIGPLAN研讨会论文集。
  • Lammel,Ralf和Jones,Simon Peyton,“废弃样板:通用编程的实用设计模式,TLDI '03:2003年ACM SIGPLAN语言设计和实现类型国际研讨会的论文集,2003年
  • Harper,2011年,《编程语言实用基础》。

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

20.4无类型表示单类型

未类型化的λ微积分可以忠实地嵌入具有递归类型的类型化语言中。这意味着每个未类型化的λ项都有一个表示形式,作为类型化的表达式,使得λ项的表示的执行与该项本身的执行相对应。这种嵌入不是用ℒ{+×⇀µ}(当然可以做到)为λ演算编写解释器的问题,而是将无类型λ项直接表示为具有递归类型的语言中的类型表达式。

关键的观察结果是,无类型的λ微积分实际上就是单类型的λ微积分! 赋予它力量的不是没有类型,而是它 只有一种类型,即递归类型

D = µt.t→t。


9
“无类型的lambda演算实际上是单类型的lambda演算”-一个漂亮的双关语!
Dmytro Sirenko

您能从哈珀的角度解释“解释器”和“直接表示”之间的区别吗?
dfeuer

“样式起源于Abadi等人” –他们的论文清楚地承认,他们在撰写论文之前就已经描述了该系统的现有实现,其历史可以追溯到Simula 67,并且他们的贡献是为其提供了正式的语义定义。 。
Jules

17

这是一个允许命名类型的库。如果a声明了类型Typeable,则可以使用show $ typeOf xwherex是type的任何值来获取其名称a。它还具有有限的类型转换功能

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


2
Typeable,不允许投放,即Dynamic。并且Dynamic不允许在不同类型之间进行转换,因为它在周围形成了安全的包装unsafeCoerceTypeable适合作为Dynamic的安全包装的一部分。它提供了获取类型的运行时表示的能力。而已。
卡尔

13
@卡尔:cast :: (Typeable a, Typeable b) => a -> Maybe b-您所需要的只是Typeable,无需Dynamic参与!使用Typeablecast实际上您可以Dynamic轻松地自己滚动…
sclv 2011年

@sclv几乎可以使用,但如果没有dynApplydynApp则无法使用该Typeable机器完成unsafeCoerce。但是,这很快就会发生。理查德·艾森伯格(Richard Eisenberg),斯蒂芬妮·魏里希(Stephanie Weirich)和其他一些名人也一直在研究它。
dfeuer

8

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

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

我敢肯定,这里有很多人可以介入的历史!


4

Data.Typeable类主要用于泛型编程在废你的样板(SYB)风格。也可以看看Data.Data

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.