Mui*_*uin 72 haskell generic-programming typeclass scrap-your-boilerplate
我遇到过对Haskell的引用Data.Typeable,但我不清楚为什么我想在我的代码中使用它.
它解决了什么问题,怎么解决?
Don*_*art 51
Data.Typeable是一种众所周知的方法(参见例如Harper)的编码,用于在静态类型语言中实现延迟(动态)类型检查 - 使用通用类型.
这样的类型包装代码,直到稍后的阶段,类型检查才会成功.编译器不是将程序拒绝为错误类型,而是将其传递给运行时检查.
风格起源于Abadi等人,由Cheney和Hinze为Haskell开发,作为代表所有动态类型的包装,Typeable该类作为SPJ和Lammel的SYB工作的一部分出现.
参考
即使在教科书中:动态类型(具有可键式表示)是仅具有一种类型的静态类型语言,Harper ch 20:
20.4无类型意味着Uni-Typed
无类型的λ演算可以忠实地嵌入具有递归类型的类型语言中.这意味着每个无类型的λ项都具有表示为类型化表达式,使得λ项的表示的执行对应于项本身的执行.这种嵌入不是在ℒ{+×⇀μ}(我们可以肯定地)中编写λ演算的解释器的问题,而是在具有递归类型的语言中将无类型λ项直接表示为类型表达式.
关键的观察是无类型的 λ演算实际上是单类型的 λ演算!不是没有 类型赋予它力量,而是它 只有一种类型,即递归类型
D =μt.t→t.
Fre*_*Foo 19
它是一个允许命名类型的库.如果a声明了一个类型Typeable,那么你可以使用show $ typeOf xwhere x的任何值来获取它的名字a.它还具有有限的类型铸造功能.
(这有点类似于C++的RTTI或动态语言的反映.)
我可以找到的Data.Typeable关于Haskell 的类似库的最早描述之一是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类主要用于泛型编程在废你的样板(SYB)风格.另请参见Data.Data
这个想法是SYB定义了一个集合组合器,用于在各种用户创建的类型上以统一的方式执行打印,计数,搜索,替换等操作.该Typeable类型类提供了必要的管道.
在现代GHC中,您可以说deriving Data.Typeable在定义自己的类型时,为其提供必要的实例.