题
我在自学哈斯克尔。
我想编写一个函数,该函数递归地找到具有整数平方根且小于起始数字的第一个数字。
看起来像这样:
findFirstSquare :: Int -> Int
findFirstSquare x
| x <= 0 = error "This function only works for 1 or above"
| fromInteger(floor(sqrt(x))) == (sqrt x) = x
| otherwise = intSqrt(x - 1)
但是GHC抱怨:
没有用于(realfrac int)的实例。
但是,如果我将以下内容键入GHCI,它会愉快地汇编它:
fromInteger(floor(sqrt(4))) == (sqrt 4)
我的问题是:为什么我会从GHCI成功编译的表达式中获得类型错误?
解决方案
好的,我发现了。
不同之处在于,常数“ 4”被超载,因此交互式的SQRT(4)获得了该方的平方根 漂浮 4
但是我的功能将x声明为 int, ,因此我需要向呼叫SQRT添加一个从集体核心,以便它们可以工作。
将中后卫更改为以下方面的困难:
| fromIntegral(floor(sqrt(fromIntegral(x)))) == (sqrt(fromIntegral(x))) = x
不隶属于 StackOverflow