Преобразование между Int и дробными значениями - PullRequest
1 голос
/ 14 октября 2011

Я программирую на 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 Ответ

6 голосов
/ 14 октября 2011

Если вы посмотрите на тип 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))]
...