Просто чтобы перейти к последнему биту, который не охватили другие ответы ...
*Euler> :t prime
prime :: (Integral a, RealFrac a, Floating a) => a -> Bool
Проверщик типов предположил, что prime
может принимать аргумент типа a
, если a
является экземпляром классов Integral
, RealFrac
и Floating
одновременно.
*Euler> prime 5
<interactive>:1:0:
Ambiguous type variable `t' in the constraints:
`Floating t' arising from a use of `prime' at <interactive>:1:0-6
`RealFrac t' arising from a use of `prime' at <interactive>:1:0-6
`Integral t' arising from a use of `prime' at <interactive>:1:0-6
Probable fix: add a type signature that fixes these type variable(s)
Однако, когда вы спрашиваете у него prime 5
, он жалуется, что ни один из типов 5
по умолчанию не может удовлетворить эти условия.
Вполне возможно, что вы могли бы написать свой собственный
instance (Integral a, RealFrac b, Floating b) => Integral (Either a b) where ...
instance (Integral a, RealFrac b, Floating b) => RealFrac (Either a b) where ...
instance (Integral a, RealFrac b, Floating b) => Floating (Either a b) where ...
(и вам также нужно будет добавить Num
, Ord
, Real
, Fractional
и т. Д.), И тогда prime 5
будет приемлемым, поскольку существует 5 :: Either Integer Float
который удовлетворяет условиям типа.