我曾经看到过 Haskell 的 Data.Typeable
的参考,但我不清楚为什么我要在我的代码中使用它。
它解决了什么问题?怎么用?
我曾经看到过 Haskell 的 Data.Typeable
的参考,但我不清楚为什么我要在我的代码中使用它。
它解决了什么问题?怎么用?
Data.Typeable
是一种著名的方法(例如参见Harper),用于在静态类型语言中实现延迟(动态)类型检查的编码——使用通用类型。
这种类型包装了代码,其类型检查直到以后的某个阶段才能成功。编译器不会将程序拒绝为非法类型,而是将其传递给运行时检查。
这种风格起源于Abadi等人,并由Cheney和Hinze开发用作表示所有动态类型的包装器,Typeable
类出现在SPJ和Lammel的SYB工作中。
参考文献
这是一个库,其中包括命名类型等功能。如果一个类型 a
声明了 Typeable
,那么你可以使用 show $ typeOf x
获取它的名称,其中 x
是任何类型为 a
的值。该库还具有 有限的类型转换 功能。
(这与 C++ 中的 RTTI 或动态语言中的反射有些相似。)
Typeable
不允许强制转换类型,这是 Dynamic
的作用。而 Dynamic
不允许在不同类型之间进行强制转换,因为它在 unsafeCoerce
周围形成了一个安全的封装器。Typeable
是 Dynamic
安全封装器的一部分,它提供了获取类型的运行时表示的能力。仅此而已。 - Carlcast :: (Typeable a, Typeable b) => a -> Maybe b
-- 只需使用 Typeable
,无需涉及 Dynamic
!实际上,使用 Typeable
和 cast
,你可以很容易地自己编写 Dynamic
... - sclvTypeable
机制还无法实现dynApply
和dynApp
,需要使用unsafeCoerce
。然而,这很快就会发生,Richard Eisenberg、Stephanie Weirich和其他一些杰出人物一直在努力解决这个问题。 - dfeuer我找到的最早关于Haskell的Data.Typeable
类似库的描述之一是由John Peterson在1992年发表的: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
我相信这里肯定有很多中间历史,希望有人可以补充!
Typeable
类型类提供了必要的工具。deriving Data.Typeable
来为其提供必要的实例。