Difference between `data` and `newtype` in Haskell和其他几个问题解决了数据和新类型之间的一般差异。我的问题是一个非常具体的问题。如果G是某种类型,两者之间是否有任何区别
data T = T !G

newtype T = T G

它们似乎具有相同的严格性属性,而且我不明白为什么编译器没有任何理由对它们进行不同的编译,但是也许我缺少了一些东西。

最佳答案

主要区别在于它将如何进行编译。所有data声明introduce memory overhead,而newtype不。

这是内存占用量测量库的输出。

import GHC.DataSize

data A = A !Int
newtype B = B Int

main = do
  print =<< (recursiveSize $! A 1)
  print =<< (recursiveSize $! B 1)
  print =<< (recursiveSize $! 1)

输出:
32
16
16

Shachaf在第一条评论中提到了另一个区别。

关于haskell - 严格的单构造函数单字段数据声明与newtype,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21327740/

10-11 17:45