考虑:
> :t (/)
(/) :: Fractional a => a -> a -> a
和
> :t (round 10 / 100)
(round 10 / 100) :: (Fractional a, Integral a) => a
如何(/)导致积分?
答案 0 :(得分:7)
我相信你误读了结果类型
result :: (Fractional a, Integral a) => a
此类型是result
的用户与result
的实施者之间的“合同”。让我们把它分开:
a
a
属于班级Fractional
和Integral
。粗略地说,这意味着用户必须为这些类的方法提供定义。a
类型的值。第2部分是至关重要的一步。我们可以看到,result
的类型不承诺构造一些类型为小数和整数的值。恰恰相反:要求任何想要使用result
值的人都必须找到这样的类型。
具体而言,这意味着result
无法使用。 GHC不会引发类型错误,因为它对类型类的预期含义没有深入的了解。实际上,从纯粹的理论角度来看,可以定义自定义类型并提供分数/整数实例,例如
data A = A0 | A1 | A2
instance Num A where
...
instance Fractional A where
...
instance Integral A where
...
有一些奇怪的实现,例如执行模3的小数运算,但不是积分运算。
无论如何,由于可以定义类似A
的内容,GHC不能拒绝上述类型。