Нет экземпляра для (Floating Int) (Fractional Int) - PullRequest
0 голосов
/ 26 сентября 2018

Вот часть моего кода:

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 = ...

1 Ответ

0 голосов
/ 26 сентября 2018

plotEllipse1 принимает кортеж Int с:

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, что означает, что левая и правая стороны должны быть одного типа. * 1019Тип *

endX относится к классам типов Fractional и Floating, так как вы используете sqrt и / для его получения.Но помните, что левая и правая части > должны быть одного типа, поэтому curX также должен иметь тип с этими типами классов, но его тип, Int, определенно не является частью этих типов.typeclasses , на которые жалуются сообщения об ошибках.

Итак, как мы можем это исправить?Мы конвертируем 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)))
...