在读编译运行管道的各个阶段,type
声明和newtype
声明之间有什么不同?类型和新类型之间的编译时间和运行时间差
我的假设是,他们编译成相同的机器指令,而唯一的区别是,当程序typechecked,其中,例如
type Name = String
newtype Name_ = N String
您可以使用一个Name
任何地方String
是必需的,但是如果您使用Name_
(其中String
是预期的,即使它们编码了相同的信息),类型检测器也会将您叫出来。
我问这个问题,因为如果是这样的话,我看不出有任何理由如下声明不应该是有效的:
type List a = Either() (a, List a)
newtype List_ a = L (Either() (a, List_ a))
然而,类型检查器接受第二一但拒绝第一个。这是为什么?
这不是一个编译问题,它是一个类型检查问题。 Haskell使用“iso-recursive types”而不是“equi-recursive types”,所以如果你希望你的类型是递归的,你必须在那里有一个'data'或'newtype'。每种选择都有各种各样的权衡。请参阅Pierce的类型和编程语言以了解更多关于这些系统和涉及的选择。 – luqui 2013-02-11 12:03:52
谢谢,我想我只需要“iso-recursive”和“equi-recursive”这两个名字就可以知道Google要做什么!如果你想将其转换为答案,我会接受它。 – 2013-02-11 12:08:11