Haskell - 无法在无限序列中推导出(a~Integer)

Eli*_*ICA 0 haskell

powers_of :: (Integral a) => a -> [Integer]
powers_of n = sequence
where
    sequence = 1 : next sequence
    next (first : rest) = (n * first) : next rest
Run Code Online (Sandbox Code Playgroud)

这让我:

Could not deduce (a ~ Integer)
from the context (Integral a)
  bound by the type signature for
             powers_of :: Integral a => a -> [Integer]
  at Triangle.hs:(10,1)-(13,61)
  `a' is a rigid type variable bound by
      the type signature for powers_of :: Integral a => a -> [Integer]
      at Triangle.hs:10:1
Expected type: [Integer]
  Actual type: [a]
In the expression: sequence
In an equation for `powers_of':
    powers_of n
      = sequence
      where
          sequence = 1 : next sequence
          next (first : rest) = (n * first) : next rest
Run Code Online (Sandbox Code Playgroud)

当我摆脱Integral类型类并只签名时Integer -> [Integer],一切都很好.为什么是这样?是类型推理系统的某种失败吗?

Car*_*arl 6

绝对不是推理系统的失败.这是推理系统的成功.

它观察到了(*) :: Num a => a -> a -> a.它观察到第一个论点(*)必须与论证统一起来powers_of.它观察到结果(*)必须与结果列表的元素类型统一powers_of.

这三件事一起说,参数类型powers_of必须与结果列表的元素类型相同.

和错误消息告诉你,它没有任何背景,以证明aInteger是同一类型的,它需要的功能类型检查.