2017-05-30 7 views
0

私は以下の持っている:をして「PersistEntityBackend(エンティティA)」タイプと一致しませんでした「SqlBackend」

asSqlBackendReader :: ReaderT SqlBackend m a -> ReaderT SqlBackend m a 
asSqlBackendReader = id 

insertEnt :: (Entity a) -> IO (Key (Entity a)) 
insertEnt x = runWithDb $ do 
    insert $ x 
    where runWithDb = runSqlite "test.db" . asSqlBackendReader 

asSqlBAckendReaderの目的はPersistent selectList causing error of "Couldn't match type ‘BaseBackend backend0’ with ‘SqlBackend’"によるものです。

私はのエラーに実行しているよ:

• Couldn't match type ‘PersistEntityBackend (Entity a)’ 
       with ‘SqlBackend’ 
    arising from a use of ‘insert’ 
• In a stmt of a 'do' block: insert $ x 
    In the second argument of ‘($)’, namely ‘do { insert $ x }’ 
    In the expression: runWithDb $ do { insert $ x } 

答えて

1

insertEntの署名に制約を追加します。 PersistEntityという制約も必要です。

insertEnt 
    :: (PersistEntity (Entity a) 
    , PersistEntityBackend (Entity a) ~ SqlBackend) 
    => Entity a -> IO (Key (Entity a)) 

(ちょうどそれが間接的に求めているものをコンパイラに与える以外の)ことを推定するために、あなたはthe type of insert

insert 
    :: (PersistStoreWrite backend 
    , MonadIO m 
    , PersistRecordBackend record backend) 
    => record -> ReaderT backend m (Key record) 

を見てもよいまた、さらに

type PersistRecordBackend record backend = 
    (PersistEntity record 
    , PersistEntityBackend record ~ BaseBackend backend) 

を持っていますあなたのアプリケーションには、いくつかの具体的なタイプがあります:

backend ~ SqlBackend 
m ~ (some concrete transformer stack on top of IO) 
record ~ Entity a 

これらの具体的な種類はPersistStoreWrite backendMonadIO mを放電し、Entity aはまだほとんどが抽象的であるため、あなたはPersistRecordBackendを定義する2つの制約が残っています。実際には、その同義語を略語として使用できます。

insertEnt 
    :: PersistRecordBackend (Entity a) SqlBackend 
    => Entity a -> IO (Key (Entity a)) 
+0

ああ、その欠落した制約も署名の一部である必要があります。私は説明を更新します。 –

関連する問題