这段代码是如何
data D = D { _d :: ![P] } -- Note the strictness annotation!与此相比
newtype D = D { _d :: [P] }一个answer to a related question说:
数据和新类型的主要区别在于,对于数据,数据构造函数是懒惰的,而新类型是严格的。
当data版本有严格的注释时,这种差异是如何工作的?
(这个问题是基于我偶然发现的真实代码)
发布于 2018-11-20 10:56:10
例如,
case undefined of
D d -> "hello"将错误输出到data类型(严格或不严格),但对于新类型将计算为"hello"。
这是因为,在运行时,应用newtype构造函数或模式匹配不对应于任何操作。甚至不强制我们case的值。
相反,data构造函数上的模式匹配总是强制我们case所依赖的值。
我认为这是严格的data和newtype之间唯一的运行时区别。存在一些静态差异,例如一些只影响newtype、Coercible等的GHC扩展,但在运行时这两种类型是同构的(但模式匹配的操作方式不同,如上面所示)。
https://stackoverflow.com/questions/53391237
复制相似问题