我写这个有什么区别?
data Book = Book Int Int
Run Code Online (Sandbox Code Playgroud)
与
newtype Book = Book (Int, Int) -- "Book Int Int" is syntactically invalid
Run Code Online (Sandbox Code Playgroud) 似乎newtype定义只是data遵循某些限制的定义(例如,只有一个构造函数),并且由于这些限制,运行时系统可以newtype更有效地处理s.并且未定义值的模式匹配处理略有不同.
但是假设Haskell只知道data定义,没有newtypes:编译器不能自己发现给定的数据定义是否遵守这些限制,并自动更有效地对待它?
我确定我错过了什么,必须有更深层次的理由.
这段代码怎么样?
data D = D { _d :: ![P] } -- Note the strictness annotation!
Run Code Online (Sandbox Code Playgroud)
与此相比
newtype D = D { _d :: [P] }
Run Code Online (Sandbox Code Playgroud)
数据和newtype之间的主要区别在于,数据是数据构造函数是惰性的,而newtype是严格的
当data版本具有严格注释时,这种差异如何工作?
(问题是基于我偶然发现的真实代码)