什么是Haskell的Data.Typeable?

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.

  • "无类型的lambda演算实际上是单型lambda演算" - 一个美丽的双关语! (9认同)

Fre*_*Foo 19

它是一个允许命名类型的库.如果a声明了一个类型Typeable,那么你可以使用show $ typeOf xwhere x的任何值来获取它的名字a.它还具有有限的类型铸造功能.

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

  • @Carl:`cast ::(Typeable a,Typeable b)=> a - >也许是b` - 所有你需要的是`Typeable`,不涉及`Dynamic`!使用`Typeable`和`cast`你实际上可以很容易地推出自己的`Dynamic` ... (13认同)
  • 不."Typeable"不允许施放,即"动态".而且`Dynamic`不允许在不同类型之间进行转换,因为它形成了`unsafeCoerce`的安全包装.`Typeable`适合作为`Dynamic`的安全包装器的一部分.它提供了获取类型的运行时表示的功能.而已. (2认同)

scl*_*clv 9

我可以找到的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

我相信这里有很多介入的历史,有人可以参与其中!


Lam*_*eek 5

该Data.Typeable类主要用于泛型编程在废你的样板(SYB)风格.另请参见Data.Data

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

在现代GHC中,您可以说deriving Data.Typeable在定义自己的类型时,为其提供必要的实例.