Правила вывода Haskell TypeClasses и класс без метода - PullRequest
1 голос
/ 25 сентября 2019

Я пытаюсь глубже понять парадигму глобальных переменных в Haskell, я взялся за работу над https://kodu.ut.ee/~nestra/eng/splst11.pdf, в качестве упражнения.Первое, что я сделал, это переписал часть кода в 2.1 - Модуль библиотеки: изменил это

data family Var a :: *    -- family declaration
class (Show l, Ord l) => Variable l where    -- Class w/o method

на

class (Show l, Ord l, Eq l) => Variable l where
    data Var l :: *

Это должно иметь то же значение (мое предположение ..)с оригинальным кодом GHC жалуется дальше при компиляции.Тем не менее любопытно (для меня) то, что GHC жалуется, если экземпляр класса не объявлен с явным выражением получения (моя первая попытка выглядит избыточной:

instance Variable Integer where 
    data Var Integer = X | Y deriving (Show, Eq, Ord)

Вопросы:

  1. Разве не является производной частью унаследованного класса "свойство" - я ожидал не повторять это в экземплярах класса.
  2. Можно ли писать в том же стиле, что и на бумаге, без GHCжаловаться на Illegal instance declaration for `Variable (Var Int)' в строке с instance Variable (Var Int) может быть это haskell старого стиля (GHC98)? Чтобы избежать этого, мне пришлось объявить класс по-другому.

1 Ответ

0 голосов
/ 25 сентября 2019

Хорошо, ребята, проблема на самом деле не была проблемой, сначала я пропустил подсказку GHC (GHC всегда немного загадочен в своем сообщении об ошибке, поэтому я не привык тратить много времени на их чтение)- Я думаю, что с этой языковой прагмой код работает без сбоев.Для тех, кто попытается реализовать статью - добавьте {- # LANGUAGE FlexibleInstances # -}, тогда, вероятно, сообщение не будет опубликовано - если вы, как и я, продолжите определять тип данных и метод внутри класса, добавьте ограничение в уравнениена уровне класса (статья реализует его экземпляры, но не на уровне класса)

...