2017-05-30 4 views
0

J'ai les suivantes:Impossible type de correspondance « PersistEntityBackend (entité a) » avec « 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 

Le but du asSqlBAckendReader est due à Persistent selectList causing error of "Couldn't match type ‘BaseBackend backend0’ with ‘SqlBackend’".

Je suis en cours d'exécution dans une erreur de:

• 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 } 

Répondre

1

Ajouter la contrainte à la signature de insertEnt. Vous aurez également besoin d'une contrainte PersistEntity.

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

Pour en déduire que (autre que simplement donner le compilateur ce qu'il demande indirectement), vous pouvez regarder the type of insert

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

Nous avons aussi

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

En outre, Dans votre application, vous avez des types concrets:

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

Ces types de béton décharge PersistStoreWrite backend et MonadIO m, et puisque la plupart du temps Entity a est encore abstraite, il vous reste les deux contraintes qui définissent PersistRecordBackend. Vous pourriez en fait utiliser ce synonyme comme raccourci:

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

Oh oui, cette contrainte manquante devrait également faire partie de la signature. Je vais mettre à jour avec une explication. –