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)))