编译类型和newtype之间的时间和运行时间差异

时间:2013-02-11 12:01:11

标签: haskell types

在read-compile-run管道的各个阶段,type声明和newtype声明之间有什么区别?

我的假设是他们编译成相同的机器指令,唯一的区别是当程序被类型检查时,例如

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))

但是,类型检查器接受第二个但拒绝第一个。那是为什么?

1 个答案:

答案 0 :(得分:4)

Luqui的评论应该是一个答案。 Haskell中的类型同义词是第一次近似,只不过是宏。也就是说,它们通过类型检查器扩展为完全评估的类型。类型检查器无法处理无限类型,因此Haskell没有等递归类型。

newtypes为您提供iso-recursive类型,在GHC中,它基本上编译为核心语言中的等递归类型。 Haskell不是GHC核心,因此您无法访问此类型。对于类型检查器和人类来说,等递归类型更难以处理,而等递归类型具有相同的功率。