Вы можете увидеть проблему, если спросите тип:
divisors :: (Integral t, Floating t) => t -> [(t, t)]
, а затем проверьте, какие вещи являются Integral
и Floating
:
Prelude> :info Floating
class Fractional a => Floating a where
instance Floating Float -- Defined in GHC.Float
instance Floating Double -- Defined in GHC.Float
и
Prelude> :info Integral
class (Real a, Enum a) => Integral a where
instance Integral Integer -- Defined in GHC.Real
instance Integral Int -- Defined in GHC.Real
, поэтому он не может быть Int, Integer, Float или Double.У вас проблемы ...
К счастью, мы можем конвертировать между типами, так что если sqrt
нужен плавающий, а mod
нужен интеграл (кстати, rem
быстрее), мыможет либо, например, покончить с делением с плавающей запятой:
divisors :: Integer -> [(Integer, Integer)]
divisors x = [(a, x `div` a) | a <- [2..ceiling (sqrt (fromIntegral x))], x `rem` a == 0]
> divisors 100
[(2,0),(4,0),(5,0),(10,0)]
Однако вам нужно серьезно подумать о том, что вы на самом деле хотите делать при преобразовании целочисленных типов в число с плавающей запятой через sqrt
...