严格的单构造函数单字段数据声明与newtype

dfe*_*uer 6 haskell

Haskell中的`data`和`newtype`之间的区别以及其他一些问题解决了数据和newtype之间的一般差异.我的问题非常具体.如果G是某种类型,是否有任何区别

data T = T !G

newtype T = T G

它们似乎具有相同的严格属性,我不明白为什么编译器有任何理由以不同的方式编译它们,但也许我错过了一些东西.

Nik*_*kov 3

主要区别在于它的编译方式。所有data声明都会引入内存开销,而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)
Run Code Online (Sandbox Code Playgroud)

输出:

32
16
16
Run Code Online (Sandbox Code Playgroud)

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

  • 语义上有区别:“A _ -&gt; () 的 case undefined” 是“未定义”;`B _ -&gt; ()` 的未定义情况是 `()`。 (10认同)