我遇到过对Haskell的引用Data.Typeable,但我不清楚为什么要在代码中使用它。
它解决什么问题,以及如何解决?
Answers:
Data.Typeable是一种众所周知的方法(例如参见Harper)的编码,该方法用于使用静态类型的语言(使用通用类型)来实现延迟(动态)类型检查。
这种类型包装了代码,直到下一个阶段,类型检查才会成功。编译器不会拒绝程序输入错误的类型,而是将其传递给运行时检查。
该样式起源于Abadi等人,由Cheney和Hinze为Haskell开发,用作表示所有动态类型的包装,Typeable该类作为SPJ和Lammel的SYB工作的一部分出现。
参考
即使在教科书中:动态类型(具有可键入的表示形式)是仅具有一种类型的静态类型化语言,Harper ch 20:
20.4无类型表示单类型
未类型化的λ微积分可以忠实地嵌入具有递归类型的类型化语言中。这意味着每个未类型化的λ项都有一个表示形式,作为类型化的表达式,使得λ项的表示的执行与该项本身的执行相对应。这种嵌入不是用ℒ{+×⇀µ}(当然可以做到)为λ演算编写解释器的问题,而是将无类型λ项直接表示为具有递归类型的语言中的类型表达式。
关键的观察结果是,无类型的λ微积分实际上就是单类型的λ微积分! 赋予它力量的不是没有类型,而是它 只有一种类型,即递归类型
D = µt.t→t。
这是一个允许命名类型的库。如果a声明了类型Typeable,则可以使用show $ typeOf xwherex是type的任何值来获取其名称a。它还具有有限的类型转换功能。
(这有点类似于C ++的RTTI或动态语言的反映。)
Typeable,不允许投放,即Dynamic。并且Dynamic不允许在不同类型之间进行转换,因为它在周围形成了安全的包装unsafeCoerce。 Typeable适合作为Dynamic的安全包装的一部分。它提供了获取类型的运行时表示的能力。而已。
cast :: (Typeable a, Typeable b) => a -> Maybe b-您所需要的只是Typeable,无需Dynamic参与!使用Typeable,cast实际上您可以Dynamic轻松地自己滚动…
dynApply,dynApp则无法使用该Typeable机器完成unsafeCoerce。但是,这很快就会发生。理查德·艾森伯格(Richard Eisenberg),斯蒂芬妮·魏里希(Stephanie Weirich)和其他一些名人也一直在研究它。
我可以找到的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
我敢肯定,这里有很多人可以介入的历史!
该Data.Typeable类主要用于泛型编程在废你的样板(SYB)风格。也可以看看Data.Data
这个想法是SYB定义了一个集合组合器,用于在各种用户创建的类型上以统一的方式执行诸如打印,计数,搜索,替换等操作。的Typeable类型类提供了必要的管道。
在现代GHC中,您只能deriving Data.Typeable在定义自己的类型时说一下,以便为它提供必要的实例。