#haskell #floating
#haskell #плавающий
Вопрос:
Я программирую на Haskell, и у меня возникли проблемы со следующим кодом:
exactRootList :: Int -> Int -> [Int]
exactRootList ini end =
[x | x<-[ini .. end], (floor (sqrt x)) == (ceiling (sqrt x))]
Затем, когда я выполняю:
> hugs myprogram.hs
Я получаю
Error Instances of (Floating Int, RealFrac Int) required for definition of exactRootList
Я не понимаю эту ошибку.
Моя программа должна отображать список чисел, которые имеют точный корень как 4 или 9, на интервале [a, b], где a и b — два параметра функции. Пример:
exactRootList 1 10
Он должен возвращать
1 4 9
Потому что между 1 и 10 только 1, 4 и 9 имеют точный корень.
Приветствую!
Ответ №1:
Если вы посмотрите на тип sqrt
, вы увидите, что он работает только с типами, которые являются экземпляром Floating
:
> :t sqrt
sqrt :: Floating a => a -> a
Как вы, наверное, знаете, Int
это не значение с плавающей запятой. Вам нужно преобразовать ваши целые числа (переменную x
) с помощью fromIntegral
:
[x | x<-[ini .. end], let a = fromIntegral x
in (floor (sqrt a)) == (ceiling (sqrt a))]