我正在使用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包已经依赖于太阳下的一切。
答案 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的麻烦取决于您。