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],一切都很好.为什么是这样?是类型推理系统的某种失败吗?
绝对不是推理系统的失败.这是推理系统的成功.
它观察到了(*) :: Num a => a -> a -> a.它观察到第一个论点(*)必须与论证统一起来powers_of.它观察到结果(*)必须与结果列表的元素类型统一powers_of.
这三件事一起说,参数类型powers_of必须与结果列表的元素类型相同.
和错误消息告诉你,它没有任何背景,以证明a和Integer是同一类型的,它需要的功能类型检查.