这种行为上的差异可能看起来微不足道,但实际上却是美好的
因为它帮助我们认识到,即使类型定义
with data and newtype behave similarly from the programmer's point of
视图,因为它们都有值构造函数和字段,所以它们是
实际上是两种不同的机制。而数据可以用来
你自己的类型从头开始,新类型是为了使一个完全新的
新类型值的模式匹配不是
就像从盒子里拿出东西一样(就像数据一样) ,它更多
关于从一种类型到另一种类型的直接转换。
newtype Fd = Fd CInt
-- data Fd = Fd CInt would also be valid
-- newtypes can have deriving clauses just like normal types
newtype Identity a = Identity a
deriving (Eq, Ord, Read, Show)
-- record syntax is still allowed, but only for one field
newtype State s a = State { runState :: s -> (s, a) }
-- this is *not* allowed:
-- newtype Pair a b = Pair { pairFst :: a, pairSnd :: b }
-- but this is:
data Pair a b = Pair { pairFst :: a, pairSnd :: b }
-- and so is this:
newtype Pair' a b = Pair' (a, b)
听起来很有限! 那么为什么有人使用 newtype 呢?
对只有一个字段的构造函数的限制
意味着新类型和字段类型是直接的
通讯:
State :: (s -> (a, s)) -> State s a
runState :: State s a -> (s -> (a, s))