1

具有以下功能的文件:

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 时引发错误:

错误“/Users/ak/Desktop/1.hs”:4 - 定义 getCircle 所需的 Integral Float 实例

问题的本质是什么,如何解决?谢谢。

4

2 回答 2

4

您应该使用5 / 2/代替div,而不是 5 div2。原因是 haskell 对整数和浮点类型的处理方式不同——它们是不同类型类的实例。

(/)在 typeclass 中声明Fractional,而div在 typeclass 中声明Integral。这些类型类有一个共同的祖先Num,但除此之外它们没有任何子类型关系。

于 2010-09-05T19:09:29.560 回答
2

div是整数除法,因此仅适用于Integral实例。只需使用/

于 2010-09-05T19:09:09.717 回答