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

Chr*_*lor 6 haskell types

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

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

type    Name  =   String
newtype Name_ = N String
Run Code Online (Sandbox Code Playgroud)

您可以使用Name在任何地方一个String是必需的,但如果你使用的typechecker会打电话给你了Name_,其中一个String是预期的,即使它们编码相同的信息.

我问这个问题是因为,如果是这种情况,我认为没有任何理由说明以下声明不应该有效:

type    List a  =    Either () (a, List a)
newtype List_ a = L (Either () (a, List_ a))
Run Code Online (Sandbox Code Playgroud)

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

Phi*_* JF 5

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

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