Haskell会擦除类型吗?如果是,这与Java中的类型擦除有什么相似/不同之处?
发布于 2012-09-18 09:05:05
警告: experience+inference。向同时使用这两种编译器的人咨询,以了解真相。
从某种意义上说,类型检查是在编译时完成的,类型系统的几个复杂功能被简化为更简单的语言构造,是的,但以与Java相当不同的方式。
类型签名不会产生运行时开销。Haskell编译器擅长程序转换(它有更多的回旋余地,因为在许多情况下,运行顺序不是由程序员指定的),并自动内联适当的定义,并将haskell-polymorhpic (=java-generic)函数专门化为特定类型等,如果它认为合适的话。这类似于Java类型擦除,但更像Java类型擦除。
Haskell本质上不需要类型转换来确保类型安全,因为Haskell从一开始就被设计成类型安全的。我们不会将所有东西都转换成对象,也不会将它们转换回来,因为多态(泛型)函数确实可以处理任何数据类型,无论是指针类型还是未装箱的整数,它都能正常工作,没有任何花招。因此,与Java不同,强制转换不是编译多态(泛型)代码的一个特性。Haskell的人倾向于认为,如果你正在进行类型转换,那么无论如何你都已经告别了类型安全。
关于如何确保代码在编译时的静态类型正确性可以避免运行时开销的一个有趣的例子,在Haskell中有一个newtype构造,它是现有类型的类型安全包装器,并且它完全被编译-所有的构造和销毁都不会在运行时发生。类型系统确保它在编译时被正确使用,它不能在运行时获得,除非使用(类型检查的)访问器函数。
多态(泛型)函数没有多态开销。Haskell重载函数( Java接口实例方法)有一定的数据开销,因为有一个隐式的函数字典用于Java程序员的后期绑定,但实际上也是在编译时确定的。
总结:是的,甚至比在Java中更多,而且不,它们从来没有在运行时擦除过。
发布于 2012-09-18 17:14:06
C和Pascal有类型擦除。Java允许你在运行时检查类--甚至是动态加载的类!
Haskell所做的事情更接近于Pascal而不是Java。
https://stackoverflow.com/questions/12468722
复制相似问题