LINUX.ORG.RU

Haskell - ошибка в описании типа


0

0

Доброго времени суток.

Создаю вот такой тип данных и класс типов:

data (Integral a, Integral b, Integral c) => FractionType a b c = FractionType
  {
    intPart   :: a,
    nomPart   :: b,
    denomPart :: c
  } deriving (Eq, Show)

class (Num a) => NaturalFraction a where
  normalize :: a -> a

instance (Integral a, Integral b, Integral c) => NaturalFraction (FractionType a b c)

GHC начинает материться, что не может вывести (Num (FractionType a b c)) из контекста и что нужно добавить это дело туда.

Не понимаю зачем, но меняю последнюю строку на:

instance (Num (FractionType a b c), Integral a, Integral b, Integral c) => NaturalFraction (FractionType a b c)

Тогда код начинает компилироваться, но только после указания ключа -XUndecidableInstances. Вопрос: зачем приходится указывать в контексте Num (...), если NaturalFraction итак производный от него?


> GHC начинает материться, что не может вывести (Num (FractionType a b c)) из контекста и что нужно добавить это дело туда.

А сначала определить экземпляр (Integral a, Integral b, Integral c) => (Num (FractionType a b c)) не пробовал?

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Спасибо, оно самое.

Возникает другой вопрос: если при реализации методов класса Num мне потребуется метод normalize класса NaturalFraction, то я должен его реализовать отдельной функцией вне инстанса (например frNormalize), в реализации методов Num использовать frNormalize, а в instance NaturalFraction написать определение:

  normalize = frNormalize

Получается так?

vega
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.