首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Haskell中`data`和`newtype`的区别

Haskell中`data`和`newtype`的区别
EN

Stack Overflow用户
提问于 2011-05-05 04:50:49
回答 1查看 25.9K关注 0票数 208

我写这篇文章的时候有什么不同?

代码语言:javascript
复制
data Book = Book Int Int

对比

代码语言:javascript
复制
newtype Book = Book (Int, Int) -- "Book Int Int" is syntactically invalid
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-05 04:58:40

问得好!

这里有几个关键的区别。

Representation

  • newtype保证您的数据在运行时将具有与您包装的类型完全相同的表示。
  • data在运行时声明了一个全新的数据结构。

所以这里的关键点是保证newtype的构造在编译时被擦除。

示例:

  • data Book = Book Int Int

  • newtype Book = Book (Int, Int)

请注意,由于Book构造函数已被擦除,因此它的表示与(Int,Int)完全相同。

  • data Book = Book (Int, Int)

具有newtype中不存在的附加Book构造函数。

  • data Book = Book {-# UNPACK #-}!Int {-# UNPACK #-}!Int

没有指针!在Book构造函数中,这两个Int字段是未装箱的单词大小的字段。

代数数据类型

由于需要擦除构造函数,因此仅当使用作为单个构造函数包装数据类型时,newtype才有效。没有“代数”新类型的概念。也就是说,你不能写一个新类型的等价物,比如说,

代码语言:javascript
复制
data Maybe a = Nothing
             | Just a

因为它有多个构造函数。你也不会写

代码语言:javascript
复制
newtype Book = Book Int Int

严格性

构造函数被擦除这一事实导致了datanewtype之间在严格性方面的一些非常细微的差异。特别是,data引入了一个“提升”的类型,这意味着,本质上,它有一种额外的方法来计算到最低值。因为newtype在运行时没有额外的构造函数,所以这个属性不成立。

(,)Book构造函数中的额外指针允许我们将底部值放入。

因此,与explained in the Haskell wiki article一样,newtypedata具有略微不同的严格属性。

拆箱

拆开newtype的组件是没有意义的,因为没有构造函数。虽然这样写是完全合理的:

代码语言:javascript
复制
data T = T {-# UNPACK #-}!Int

生成具有T构造函数和Int#组件的运行时对象。您只需使用newtype获得一个空Int即可。

参考文献

的严格性属性

票数 265
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5889696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档