Haskell中`data`和`newtype`之间的区别
||
我写这篇文章有什么区别?
data Book = Book Int Int
与
newtype Book = Book (Int, Int) -- \"Book Int Int\" is syntactically invalid
没有找到相关结果
已邀请:
1 个回复
丧泉缝锋
保证您的数据在运行时将具有与包装的类型完全相同的表示形式。
在运行时声明了全新的数据结构。 因此,这里的重点是保证ѭ2the的构造在编译时会被删除。 例子:
注意,由于删除了
构造函数,因此它与
具有完全相同的表示形式。
在
中没有其他的
构造函数。
没有指针!两个
字段是
构造函数中未装箱的单词大小的字段。 代数数据类型 由于需要擦除构造函数,因此只有在用单个构造函数包装数据类型时,ѭ2才有效。没有“代数”新类型的概念。也就是说,您不能编写与
因为它有多个构造函数。你也不能写
严格 删除构造函数的事实在
和
之间的严格性上导致一些非常细微的差异。特别地,“ 3”引入了一种“提升”类型,从本质上讲,它意味着可以使用另一种方式求出底值。由于在运行时没有带有constructor2ѭ的附加构造函数,因此该属性不成立。
到
构造函数中的额外指针使我们可以放入一个底值。 结果,如Haskell Wiki文章所述,
和
的严格性属性稍有不同。 拆箱 因为没有构造函数,所以将ѭ2的组件拆箱是没有意义的。虽然写是完全合理的:
生成一个带有ѭ28with构造函数和
组件的运行时对象。您只得到a2ѭ的
。 参考文献: Haskell Wiki上的“ Newtype” 诺曼·拉姆齐(Norman Ramsey)关于严格性属性的答案