gpt4 book ai didi

haskell - Haskell中 `data`和 `newtype`之间的区别

转载 作者:行者123 更新时间:2023-12-02 04:38:57 25 4
gpt4 key购买 nike

我写这个有什么区别?

data Book = Book Int Int

对比

newtype Book = Book (Int, Int) -- "Book Int Int" is syntactically invalid

最佳答案

好问题!

有几个关键区别。

代表

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

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

示例:

  • 数据簿 = Book Int Int

data

  • newtype Book = Book (Int, Int)

newtype

请注意它如何与 (Int,Int) 具有完全相同的表示形式,因为 Book 构造函数已被删除。

  • 数据书 = Book (Int, Int)

data tuple

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

  • 数据书 = 书 {-# UNPACK #-}!Int {-# UNPACK #-}!Int

enter image description here

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

代数数据类型

由于需要删除构造函数,因此 newtype 仅在使用单个构造函数包装数据类型时才起作用。不存在“代数”新类型的概念。也就是说,您不能编写相当于的新类型,例如

data Maybe a = Nothing
| Just a

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

newtype Book = Book Int Int

严格

构造函数被删除的事实导致 datanewtype 之间的严格性存在一些非常微妙的差异。特别是,data 引入了一种“提升”的类型,本质上意味着它有一种额外的方法来计算底部值。由于 newtype 在运行时没有额外的构造函数,因此该属性不成立。

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

因此,newtypedata 的严格性属性略有不同,如 explained in the Haskell wiki article .

拆箱

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

data T = T {-# UNPACK #-}!Int

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

<小时/>

引用文献:

关于haskell - Haskell中 `data`和 `newtype`之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5889696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com