Int和小数值之间的转换

时间:2011-10-14 03:48:22

标签: haskell floating

我在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

我不明白这个错误。

我的程序应该在区间[a,b]上显示具有精确根为4或9的数字列表,其中a和b是函数的两个参数。 例如:

exactRootList 1 10

必须返回

1 4 9

因为1到10之间只有1,4和9具有确切的根。

问候!

1 个答案:

答案 0 :(得分:6)

如果您查看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))]