我遇到过对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 x
wherex
是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
在定义自己的类型时说一下,以便为它提供必要的实例。