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))
但是,类型检查器接受第二个但拒绝第一个。这是为什么?