This question already has an answer here:
Difference between `data` and `newtype` in Haskell

(1个答案)


6年前关闭。




似乎newtype定义只是遵守某些限制(例如,仅一个构造函数)的data定义,并且由于这些限制,运行时系统可以更有效地处理newtype。对于未定义的值,模式匹配的处理略有不同。

但是,假设Haskell只知道data定义,而不知道newtype:编译器是否无法自行发现给定的数据定义是否遵守这些限制,并自动更有效地对其进行处理?

我确定我错过了一些东西,这一定有更深层次的原因。

最佳答案

newtype和单个构造函数data都引入了单个值构造函数,但是newtype引入的值构造函数是严格的,而data引入的值构造函数是惰性的。所以如果你有

data D = D Int
newtype N = N Int

然后,N undefined等效于undefined并在评估时导致错误。但是D undefined不等于undefined,并且只要您不尝试在内部窥视就可以对其进行评估。



不,不是真的–在这种情况下,作为程序员,您需要确定构造函数是严格的还是惰性的。要了解何时以及如何使构造函数变得严格或懒惰,您必须比我对懒惰评估有更好的理解。我坚持报告中的想法,即newtype可让您重命名现有类型,例如具有几种不同的不兼容类型的度量值:
newtype Feet = Feet Double
newtype Cm   = Cm   Double

两者在运行时的行为都与Double完全一样,但是编译器保证不会让您混淆它们。

10-01 15:00