Haskell 笔记:data, type, newtype
原文链接 https://hsfzxjy.github.io/2018-11-16-haskell-data-type-newtype/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
新类型有自己的 data constructor (literals 可以看成特殊的 data constructor),由这一点来区分是否创建了新类型。
data
创建了新类型,可以有多个 data constructor。newtype
创建了新类型,只能有一个 data constructor,同时新类型的内存布局与原来的类型相同。type
没有创建新类型,只是建立了 alias,没有新的 data constructor。
type
常用于语义化类型,是业务逻辑层的概念。
type ID = Int
a = 1 :: ID
b = a + 2 -- legal
showID :: ID -> IO ()
showID x = print x -- legal, since Int has already been an instance of class Show
-- illegal, since Int has already been instantiated
instance Show ID where
-- ...
newtype
在编译期创建新类型,但差异在运行期被抹去。带有一个构造器。
newtype ID' = ID' Int
a = ID' 1
b = a + 2 -- illegal, since Int and ID' are totally different types
showID' :: ID' -> IO ()
showID' x = print x -- illegal, since ID' is not an instance of Show
-- either
showID' (ID' x) = print x
-- or
instance Show ID' where
show (ID' x) = show x