我可以在GHCi中添加实例声明吗?

Joh*_*ler 14 haskell typeclass ghc ghci

我正在搞乱,HashMap并试图用Data.Bson.ObjectId一把钥匙.当然,我发现Hashable该结构没有实例.没关系,因为写一个是微不足道的.1

instance Hashable ObjectId where hash (Oid x y) = hash (x,y)
Run Code Online (Sandbox Code Playgroud)

我将该行键入GHCi并被告知"输入`实例'上的解析错误".这实际上是有意义的,因为GHCi提示操作就好像在IO monad中将行键入到do块中,并且在此上下文中无法定义实例.

那么我的问题是,有没有办法在GHCi中定义一个新实例?


1为什么库不提供此实例是另一回事.我相信答案是限制依赖性,除了bson包已经依赖于太阳下的一切.

C. *_*ann 14

好消息:是的,有一种方法可以在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
Run Code Online (Sandbox Code Playgroud)

您是否认为现在拥有安装非发布版GHC的麻烦取决于您.