什么是Haskell的Data.Typeable?
我遇到了Haskell的Data.Typeable
引用,但是我不清楚为什么我想在我的代码中使用它。
它解决了什么问题,以及如何解决?
Data.Typeable
是一个众所周知的方法的编码(见例如Harper)以静态types语言实现延迟(dynamic)types检查 – 使用通用types。
这种types的包装代码的types检查将不会成功,直到后来的阶段。 编译器将其传递给运行时检查,而不是将程序作为不良types来拒绝。
风格起源于Abadi等人,由Cheney和Hinze为Haskell开发,用来表示所有dynamictypes, Typeable
类作为SPJ和Lammel的SYB工作的一部分出现。
参考
- MartínAbadi,Luca Cardelli,Benjamin Pierce和Gordon Plotkin,“ 静态types语言的dynamicinput ”,ACM编程语言和系统学报(TOPLAS),1991年。
- James Cheney和Ralf Hinze,“ generics和dynamic的轻量级实现 ”,Haskell '02:2002年ACM SIGPLAN研讨会论文集,Haskell,2002。
- Lammel,Ralf和Jones,Simon Peyton,“ Scrap your stylesplate :a practical design pattern for generic programming,TLDI'03:Proceedings of 2003 ACM SIGPLAN International Workshop on Types in Languages Design and Implementation,2003
- 哈珀,2011年,编程语言的实践基础。
即使在课本中:dynamictypes(带有可表示types)是静态types语言,只有一种types,Harper ch 20:
20.4无types的意思
无types的λ演算可以忠实地embedded到具有recursiontypes的types化语言中。 这意味着每一个无types的λ-项都有一个expression式作为一个types化的expression式,这样一个λ-项的表示的执行就相当于该项本身的执行。 这种embedded不是为λ演算写一个解释器(我们当然可以这样做),而是将一个无types的λ项直接表示成recursiontypes的语言中的typesexpression式。
关键的观察是, 无types λ演算实际上是单types λ演算! 不是没有types赋予它的权力,而是它只有一种types,即recursiontypes
D =μt.t→t。
这是一个允许命名types的库。 如果typesa
被声明为Typeable
,则可以使用show $ typeOf x
来获取其名称,其中x
是typesa
任何值。 它还具有有限的types铸造 。
(这有点类似于C ++的RTTI或dynamic语言的reflection。)
对于Haskell而言,我能find的Data.Typeable
类库最早的描述之一是1992年的John Peterson: 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)风格的generics编程。 另请参阅Data.Data
这个想法是,SYB定义了一个集合组合器,用于以统一的方式执行各种用户创buildtypes的操作,如打印,计数,search,replace等。 typestypes类提供必要的pipe道。
在现代的GHC中,当定义自己的types时,可以说deriving Data.Typeable
,以便为其提供必要的实例。