2011-12-16 37 views
14

我正在搞HashMap並嘗試使用Data.Bson.ObjectId作爲關鍵。當然,我發現這個結構沒有一個Hashable實例。沒關係,因爲寫一個是微不足道的。我可以在GHCi中添加實例聲明

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

我輸入這行到GHCI,被告知「上輸入'實例「解析錯誤」。這實際上是有意義的,因爲GHCi提示符的操作就像在IO monad中輸入到do塊一樣,並且在這種情況下不能定義實例。

我的問題是,有沒有辦法在GHCi中定義一個新的實例?


爲什麼不是由庫提供的這種情況是另一回事。我相信答案是限制依賴關係,除了bson包已經取決於太陽下的所有東西。

回答

14

好消息:是的,有一種方法可以在GHCi中定義一個新的實例。

壞消息:目前,這樣做的第一步是「安裝GHC的開發快照」。

這在GHCi中已經有一段時間了。它沒有固有的理由缺席,但我認爲實施起來有些困難,因此它被擱置。

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

在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的非發佈版本的麻煩是你的。