带有严格注解的`newtype`和`data`之间的区别

时间:2018-11-20 10:42:49

标签: haskell lazy-evaluation newtype

此代码如何

data D = D { _d :: ![P] } -- Note the strictness annotation!

与此相比

newtype D = D { _d :: [P] }

answer to a related question说:

  

data和newtype之间的主要区别在于,与data相比,数据构造函数是惰性的,而newtype是严格的

data版本具有严格性注释时,这种区别如何起作用?

(问题是基于我偶然发现的真实代码)

1 个答案:

答案 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所基于的值。

我认为这是严格的casedata之间唯一的运行时差异。 存在一些静态差异,例如某些GHC扩展仅影响newtypenewtype等,但是在运行时,这两种类型是同构的(如上所示,模式匹配的操作方式有所不同)。 / p>