This question already has an answer here:
Difference between `data` and `newtype` in Haskell
(1个答案)
6年前关闭。
似乎
但是,假设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