2013-03-24 42 views
1

從Data.Binary:如何使用參數化實例刪除(Data.Binary)?

instance (Binary e) => Binary (IntMap.IntMap e) where 
    put = put . IntMap.toAscList 
    get = liftM IntMap.fromDistinctAscList get 

我認爲這意味着任何IntMap (Binary e)類型是serialisable,但它並不:

Data.Binary Data.IntMap> encode $ ((fromList [])::IntMap Int) 

<interactive>:12:1: 
    No instance for (Binary (IntMap Int)) 
     arising from a use of `encode' 

如何使用所提供的實例?

回答

6

我認爲這意味着任何IntMap (Binary e)類型是serialisable,但它並不:

它做(除了雞蛋裏挑骨頭,它應該讀任何IntMap e是serialisable如果有instance Binary e)。

Prelude Data.IntMap Data.Binary> encode (fromList [] :: IntMap Int) 
"\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL" 

,你有幾乎肯定意味着你使用的是IntMap是不是從你的binary與建造的containersIntMap,但從另一個版本的錯誤消息。來自containers的不同版本的IntMap s是不同的類型,並且Binary實例僅用於與之建立的確切版本binary

自從您安裝binary以來,您可能已經安裝了較新版本的containers

由ghci中的命令行上指定一個-package標誌,並通過使用Cabal編譯使用containers版本binary與建。

+0

啊!恰當地,我之前被警告說升級容器會導致問題!謝謝 – Scott 2013-03-24 22:14:25