具有以下功能的文件:
type Point = (Float, Float)
type Circle = (Float, Float, Float)
getCircle :: Point -> Point -> Point -> Circle
getCircle (a, b) (c, d) (e, f) = (x, y, r)
where
x = ((a^2+b^2)*(f-d) + (c^2+d^2)*(b-f) + (e^2+f^2)*(d-b)) `div` (a*(f-d)+c*(b-f)+e*(d-b)) `div` 2
y = ((a^2+b^2)*(e-c) + (c^2+d^2)*(a-e) + (e^2+f^2)*(c-a)) `div` (b*(e-c)+d*(a-e)+f*(c-a)) `div` 2
r = sqrt ((a-x)^2 + (b-y)^2)
当我尝试将其加载到Hugs时出错:
ERROR“/Users/ak/Desktop/1.hs":4 - 定义getCircle所需的Integral Float实例
问题的本质是什么?如何解决? 感谢。
答案 0 :(得分:4)
您应该使用/
代替div
- 5/2,而不是5 div
2.原因是haskell对积分和浮点类型的处理方式不同 - 它们是不同类型的实例。
(/)
在类型类Fractional
中声明,而div
在类型类Integral
中声明。这些类型类具有共同的祖先Num
,但除此之外它们没有任何子类型关系。
答案 1 :(得分:2)
div
是整数除法,因此只适用于Integral
个实例。只需使用/