我们什么时候在Haskell中使用newtype?

时间:2018-07-31 22:35:12

标签: haskell newtype

我对type和newtype有点困惑。据说newtype只能包含一个字段。我还找到了一条帖子here

但仍然不太清楚。

  

因此,如果您想为一个对象声明不同的类型类实例   特定类型,或者想将类型抽象化,可以将其包装在   newtype,它将被认为与类型检查器不同,但是   在运行时相同。

任何示例都将有所帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

从您发布的报价中收集的一个示例用法可能是声明两个Int Monoid。有多种方法来考虑Int的Monoid(乘法或加法),也许您希望使用多个。您不能为Int定义一个以上的monoid实例,但是可以创建两个新类型并为其提供单独的实例。

newtype SumInt = SumInt Int 
newtype ProdInt = ProdInt Int 

instance Monoid SumInt where
  mempty = SumInt 0
  (SumInt a) `mappend` (SumInt b) = SumInt (a + b)

instance Monoid ProdInt where
  mempty = ProdInt 1
  (ProdInt a) `mappend` (ProdInt b) = ProdInt (a*b)