Могу ли я добавить объявление экземпляра в GHCi - PullRequest
14 голосов
/ 16 декабря 2011

Я возился с HashMap и пытался использовать Data.Bson.ObjectId в качестве ключа. Я, конечно, обнаружил, что для этой структуры нет экземпляра Hashable. Это нормально, потому что написание одного тривиально. 1

instance Hashable ObjectId where hash (Oid x y) = hash (x,y)

Я набрал эту строку в GHCi, и мне сказали "ошибка разбора на входе" экземпляр "". Это на самом деле имеет смысл, поскольку приглашение GHCi работает так, как если бы строки вводились в блок do в монаде IO, и экземпляр не может быть определен в этом контексте.

Мой вопрос, есть ли способ определить новый экземпляр в GHCi?


1 Почему этот экземпляр не предоставлен библиотекой - это другой вопрос. Я полагаю, что ответ заключается в ограничении зависимостей, за исключением того, что пакет bson уже зависит от всего под солнцем.

1 Ответ

14 голосов
/ 16 декабря 2011

Хорошая новость: Да, есть способ определить новый экземпляр в GHCi.

Плохие новости: На данный момент первым шагом в этом направлении является «установка моментального снимка разработки GHC».

Это явный недостаток функциональности в GHCi в течение долгого времени. Не было никакой внутренней причины его отсутствия, но я предполагаю, что это было несколько сложно реализовать, и поэтому оно было отложено.

Однако, похоже, что начиная с версии 7.4.1, теперь он доступен :

В приглашении GHCi вы также можете ввести любое объявление Haskell верхнего уровня, включая объявления данных, типа, нового типа, класса, экземпляра, производного и внешнего. Например:

Prelude> data T = A | B | C deriving (Eq, Ord, Show, Enum)
Prelude> [A ..]
[A,B,C]
Prelude> :i T
data T = A | B | C      -- Defined at <interactive>:2:6
instance Enum T -- Defined at <interactive>:2:45
instance Eq T -- Defined at <interactive>:2:30
instance Ord T -- Defined at <interactive>:2:34
instance Show T -- Defined at <interactive>:2:39

Считаете ли вы, что сейчас стоит потратить время на установку не выпущенной версии GHC, вам решать.

...