Например, метод класса Haskell не виден - PullRequest
2 голосов
/ 10 ноября 2019

Я пытаюсь определить класс «Полигон» и подтипы «Треугольник» и «Квадрат». Они должны реализовать функцию площади Polygon.

Так что я попытался создать экземпляр Polygon, но это не работает.

class Polygon a where

area :: a -> Float

data Triangle = MkTriangle {
                        tP1 :: Point,
                        tP2 :: Point,
                        tP3 :: Point}
                        deriving(Show)

data Quad = MkQuad{
                    qP1 :: Point,
                    qP2 :: Point,
                    qP3 :: Point,
                    qP4 :: Point}
                    deriving(Show)

instance Polygon Triangle where
    area triangle = 5.0

Обратите внимание, что area triangle = 5.0 это просто отладка ине настоящая функция. Пытаясь скомпилировать это, я получаю следующую ошибку:

    `area' is not a (visible) method of class `Polygon'
   |
57 |         area triangle = 5
   |         ^^^^
Failed, no modules loaded.

Можете ли вы дать мне подсказку, чтобы это исправить? Спасибо!

1 Ответ

4 голосов
/ 10 ноября 2019

Вам нужно сделать отступ для метода area, чтобы он находился в области действия класса Polygon, например:

class Polygon a where
    area :: a -> Float

Определив его с тем же уровнем отступа, вы определили пустойкласса типов и создал подпись функции area без привязки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...