为什么(/)函数的结果也可能是积分?

时间:2016-03-16 12:26:38

标签: haskell

考虑:

> :t (/)
(/) :: Fractional a => a -> a -> a

> :t (round 10 / 100)
(round 10 / 100) :: (Fractional a, Integral a) => a

如何(/)导致积分?

1 个答案:

答案 0 :(得分:7)

我相信你误读了结果类型

result :: (Fractional a, Integral a) => a

此类型是result的用户与result的实施者之间的“合同”。让我们把它分开:

  1. 用户必须先选择类型a
  2. 用户必须证明所选的a属于班级FractionalIntegral。粗略地说,这意味着用户必须为这些类的方法提供定义。
  3. 最后,实现者将提供a类型的值。
  4. 第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不能拒绝上述类型。