Ошибка «Требуется экземпляр Integral Float» - PullRequest
1 голос
/ 05 сентября 2010

Файл со следующей функцией:

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 - Экземпляр Integral Float, необходимый для определения getCircle

В чем суть проблемы и как ее можно исправить?Спасибо.

Ответы [ 2 ]

4 голосов
/ 05 сентября 2010

Вы должны использовать / вместо div - 5/2, а не 5 div 2. Причина в том, что haskell по-разному обрабатывает целочисленные типы и типы с плавающей запятой - они являются экземплярами разных классов типов.

(/) объявлено в классе типов Fractional, тогда как div объявлено в классе типов Integral.Эти классы типов имеют общего предка Num, но у них нет никаких связей подтипов, кроме этого.

2 голосов
/ 05 сентября 2010

div является целочисленным делением и, следовательно, работает только на Integral инстансах.Просто используйте /

...