这是我的代码的一部分:
sqa = a*a
sqb = b*b
endX = (/) (fromIntegral sqa) (sqrt (fromIntegral (sqa + sqb)))
,a
和b
均为Int
。但是,在其上使用fromIntegral
之后,它仍然显示错误No instance for (Floating Int) arising from a use of 'sqrt'
和No instance for (Fractional Int) arising from a use of '/'
。我不知道为什么会这样。谁能帮我吗?
更多上下文:
ellipse :: (Int, Int) -> Int -> Int -> [(Int, Int), Double]
ellipse (xc, yc) a b = plotEllipse1 (xc, yc, xi, yi, di1)
where
sqa = a*a
sqb = b*b
xi = 0
yi = b
di1 = 2*sqb - 2*b*sqa + sqa
endX = (/) (fromIntegral sqa) (sqrt (fromIntegral (sqa + sqb)))
plotEllipse1 :: (Int, Int, Int, Int, Int) -> Raster
plotEllipse1 (x0, y0, curX, curY, curD)
| curX > endX = plotEllipse2 (xc, yc, curX, curY, di2)
| otherwise = ...
答案 0 :(得分:3)
plotEllipse1
包含Int
s个元组:
plotEllipse1 :: (Int, Int, Int, Int, Int) -> Raster
curX
是元组的元素之一,因此它是Int
:
plotEllipse1 (x0, y0, curX, curY, curD)
您使用curX
将endX
与>
进行比较:
| curX > endX = plotEllipse2 (xc, yc, curX, curY, di2)
>
的类型为Ord a => a -> a -> Bool
,这意味着左侧和右侧必须为同一类型。
endX
的类型属于Fractional
和Floating
类型类,因为您使用sqrt
和/
来获取它。但是请记住,>
的左右两侧必须为同一类型,因此curX
还必须具有带有这些类型类的类型,但是其类型为Int
不是这些类型类的一部分,错误消息在抱怨这些类型类。
那么,我们该如何解决呢?我们将curX
转换为endX
的类型:
| fromIntegral curX > endX = plotEllipse2 (xc, yc, curX, curY, di2)
现在fromIntegral curX
应该具有适当的类型。
还请注意,您在其他地方使用过fromIntegral
。您只是在需要的地方错过了它。
您可能还需要给endX
提供类型签名,以便编译器知道您要使用的 Fractional
和Floating
类型。例如,Double
是一个很好的候选人,所以也许您会使用:
endX :: Double
endX = (/) (fromIntegral sqa) (sqrt (fromIntegral (sqa + sqb)))