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
ます。
それで、誰かが私を助けることができますか?