此代码如何
data D = D { _d :: ![P] } -- Note the strictness annotation!
与此相比
newtype D = D { _d :: [P] }
answer to a related question说:
data和newtype之间的主要区别在于,与data相比,数据构造函数是惰性的,而newtype是严格的
当data
版本具有严格性注释时,这种区别如何起作用?
(问题是基于我偶然发现的真实代码)
答案 0 :(得分:5)
例如,
Template.reactDemo.helpers({
myCollection: function () {
myCollection = Session.get("Object")
return myCollection ;
},
settings: function () {
return {
rowsPerPage: 10,
showFilter: true,
fields: [{
key: 'property_1',
label: 'name',
//sortable: false,
fn: function (value) {
for (i = 0; i < value.length; i++) {
return value[i]
}
}
},
{
key: 'property_2',
label: 'property 2',
fn: function (value) {
for (i = 0; i < value.length; i++){
return value[i]
}
}
},
{
key: 'property_3',
label: 'Price',
fn: function (value) {
for (i=0; i<value.length;i++)
return value[i]
}
}
}]
};
}
});
对于case undefined of
D d -> "hello"
类型(严格或不严格),将出错,但对于新类型,其计算结果为data
。
这是因为在运行时,应用"hello"
构造函数,或对其进行模式匹配均不执行任何操作。甚至没有强加我们newtype
所基于的值。
相比之下,case
构造函数上的模式匹配总是强制我们data
所基于的值。
我认为这是严格的case
和data
之间唯一的运行时差异。
存在一些静态差异,例如某些GHC扩展仅影响newtype
,newtype
等,但是在运行时,这两种类型是同构的(如上所示,模式匹配的操作方式有所不同)。 / p>