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