我在自学哈斯克尔。

我想编写一个函数,该函数递归地找到具有整数平方根且小于起始数字的第一个数字。

看起来像这样:

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top