Haskell的Data.Typeable是什么?

73

我曾经看到过 Haskell 的 Data.Typeable 的参考,但我不清楚为什么我要在我的代码中使用它。

它解决了什么问题?怎么用?

4个回答

48

Data.Typeable是一种著名的方法(例如参见Harper),用于在静态类型语言中实现延迟(动态)类型检查的编码——使用通用类型。

这种类型包装了代码,其类型检查直到以后的某个阶段才能成功。编译器不会将程序拒绝为非法类型,而是将其传递给运行时检查。

这种风格起源于Abadi等人,并由Cheney和Hinze开发用作表示所有动态类型的包装器,Typeable类出现在SPJ和Lammel的SYB工作中。


参考文献


即使在教科书中,动态类型(具有可类型化表示)也是仅有一种类型的静态类型语言,哈珀第20章:
20.4 无类型意味着单类型
无类型λ演算可以被忠实地嵌入到具有递归类型的类型化语言中。这意味着每个无类型λ项都有一个表示形式作为一个类型化表达式,以这样的方式执行λ项的表示相当于执行该项本身。这种嵌入不是在ℒ{+×⇀µ}中编写λ演算解释器的问题(我们肯定可以做到),而是将无类型λ项直接表示为具有递归类型的类型化表达式。
关键观察是,无类型λ演算实际上是单类型λ演算!它并不是没有类型赋予它力量,而是只有一种类型,即递归类型
D = µt.t → t.

9
无类型 λ 演算实际上是单类型 λ 演算——这是一个非常巧妙的双关语! - Dmytro Sirenko
你能解释一下在Harper的意义下,“解释器”和“直接表示”之间的区别吗? - dfeuer
这种风格起源于Abadi等人的论文中,他们明确承认在他们写论文之前,已经有了描述该系统的现有实现,可以追溯到Simula 67,并且他们的贡献是为其提供正式的语义定义。 - Jules

17

这是一个库,其中包括命名类型等功能。如果一个类型 a 声明了 Typeable,那么你可以使用 show $ typeOf x 获取它的名称,其中 x 是任何类型为 a 的值。该库还具有 有限的类型转换 功能。

(这与 C++ 中的 RTTI 或动态语言中的反射有些相似。)


2
Typeable 不允许强制转换类型,这是 Dynamic 的作用。而 Dynamic 不允许在不同类型之间进行强制转换,因为它在 unsafeCoerce 周围形成了一个安全的封装器。TypeableDynamic 安全封装器的一部分,它提供了获取类型的运行时表示的能力。仅此而已。 - Carl
13
@Carl: cast :: (Typeable a, Typeable b) => a -> Maybe b -- 只需使用 Typeable,无需涉及 Dynamic!实际上,使用 Typeablecast,你可以很容易地自己编写 Dynamic... - sclv
@sclv,几乎可以了,但是使用Typeable机制还无法实现dynApplydynApp,需要使用unsafeCoerce。然而,这很快就会发生,Richard Eisenberg、Stephanie Weirich和其他一些杰出人物一直在努力解决这个问题。 - dfeuer

8

4
Data.Typeable类主要用于Scrap Your Boilerplate(SYB)风格的泛型编程。同时,还请查看 Data.Data
SYB为用户创建的各种类型定义了一组组合子,以统一的方式执行打印、计数、搜索、替换等操作。而Typeable类型类提供了必要的工具。
在现代GHC中,您可以在定义自己的类型时使用deriving Data.Typeable来为其提供必要的实例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接