Преобразование между целыми и дробными значениями

#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))]