Могу ли я добавить объявление экземпляра в GHCi

Я возился с 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

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

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

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

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

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

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 без релиза.