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

时间:2011-12-16 18:29:05

标签: haskell ghc typeclass ghci

我正在使用HashMap并试图使用Data.Bson.ObjectId作为关键字。当然,我发现该结构没有Hashable个实例。没关系,因为写一个是微不足道的。 1

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

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

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


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

1 个答案:

答案 0 :(得分:14)

好消息:是的,有一种方法可以在GHCi中定义一个新实例。

坏消息:目前,这样做的第一步是“安装GHC的开发快照”。

这在GHCi中已经有一段时间缺少功能了。没有固有的理由让它缺席,但我认为它有点难以实施,所以它被搁置。

然而,似乎是as of version 7.4.1, it's now available

  

在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的麻烦取决于您。