我想與Haskell Bson一起工作,我想保存並加載它們。保存似乎沒有問題,但我在Binary.get
函數中出現打字錯誤。二進制鍵入問題
這裏是我的代碼:
{-# LANGUAGE GeneralizedNewtypeDeriving, TypeSynonymInstances, FlexibleInstances #-}
module Database.Axiom where
import Data.Bson (Document, Field)
import Data.Bson.Binary (putDocument, getDocument)
import Data.Binary as B (Binary(..), decodeFile, encodeFile)
import Control.Monad (liftM2)
instance Binary Document where
put = putDocument
get = getDocument
data Collection = Collection {
collectionName :: ByteString,
collectionDocs :: [Document]
}
instance Binary Collection where
put (Collection name docs) = B.put name >> B.put docs
get = liftM2 Collection B.get B.get -- < Here is the type error
導致這個錯誤:
Database/Axiom.hs:24:39:
Overlapping instances for Binary [Field]
arising from a use of `B.get'
Matching instances:
instance Binary a => Binary [a] -- Defined in Data.Binary
instance Binary Document -- Defined at Database/Axiom.hs:13:10-24
In the third argument of `liftM2', namely `B.get'
In the expression: liftM2 Collection B.get B.get
In an equation for `get': get = liftM2 Collection B.get B.get
問題是Document
僅僅是[Field]
的代名詞。但我需要一個Binary Document
的實例,因爲沒有函數可以序列化一個Field
。此外,BSON不會爲Binary Field
導出任何實例,所以我完全困惑爲什麼這個錯誤首先發生。
我有嚴格的類型聲明試了一下,然後用一個自制get
方法,但僅get :: [Document]
很好地工作時,有一個get :: Document
方法。
那麼,任何人都可以幫助我,也許?
這不起作用,因爲第二個'get'的類型是'Get [Document]'。 – Lanbo
@Scán:哦,對,錯過了:/ – ivanm
@Scán:'[getListOf](http://hackage.haskell.org/packages/archive/cereal/0.3.3.0/doc/html/Data-Serialize-Get .html#v:getListOf)getDocument'會做的伎倆,然後如果你不想像jaspervdj描述的新類型。 – ivanm