这就是 Sum 当前的定义方式。
newtype Sum a = Sum {getSum :: a}
有没有人有例子说明它在数字上下文之外如何有用?如果不是,那么我们为什么不在定义 newtype 时将 the约束a为 beNum a呢?为什么会有人想要定义 aSum "hello"呢?
作为您引用的原始数据类型定义, Sum a实际上并没有用 - 它只是简单地包装了另一种类型。这在Num a约束下不会变得更有用,即使这实际上在实践中做了任何事情。
什么Sum是用于实践是使Semigroup和Monoid数值类型的基础上,除了实例(和避免直接连接到下面的类型享有特权这种情况下比其他可能的):
instance (Num a) => Semigroup (Sum a) where
(<>) = (+)
Run Code Online (Sandbox Code Playgroud)
当然这里约束是必要的。但是这些实例是类型甚至存在的唯一原因,并且在类型定义中包含约束没有任何好处。