6

type在读取-编译-运行管道的各个阶段,声明和声明之间有什么区别newtype

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

type    Name  =   String
newtype Name_ = N String

您可以在需要 a 的Name任何地方使用 a String,但如果您在预期 a 的Name_地方使用 a,类型检查器会告诉您String,即使它们编码相同的信息。

我问这个问题是因为,如果是这种情况,我看不出以下声明无效的任何理由:

type    List a  =    Either () (a, List a)
newtype List_ a = L (Either () (a, List_ a))

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

4

1 回答 1

4

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

newtypes为您提供等递归类型,在 GHC 中,这些类型基本上可以编译为核心语言中的等递归类型。Haskell 不是 GHC 核心,因此您无权访问此类类型。对于类型检查器和人类来说,等递归类型更难使用,而等递归类型具有同等的能力。

于 2013-02-11T19:46:25.667 回答