首页 > 解决方案 > 我们什么时候在 Haskell 中使用 newtype?

问题描述

我对 type 和 newtype 有点困惑。据说newtype只能包含一个字段。我也在这里找到一个帖子。

但还不是很清楚。

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

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

标签: haskellnewtype

解决方案


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

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)

推荐阅读