2010-09-05 5 views
1

Le fichier avec la fonction suivante:"instance de flotteur intégré requis" Erreur

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) 

génère une erreur lorsque je tente de le charger à étreintes:

ERROR «/Users/ak/Desktop/1 .hs ": 4 - Instance de Float Integral requis pour la définition de getCircle

Quelle est l'essence du problème et comment peut-il être réparé? Merci.

Répondre

4

Vous devez utiliser / en place de div-5/2, pas 5 div 2. La raison en est que haskell traite les types de points entiers et flottants différemment - ils sont des instances de différentes classes de types.

(/) est déclaré dans la classe de type Fractional, tandis que div est déclaré dans la classe de type Integral. Ces classes de type ont un ancêtre commun Num, mais elles n'ont pas de relations de sous-typage à part cela.

2

div est une division entière et fonctionne donc simplement sur Integral instanves. Il suffit d'utiliser /