2017-05-29 3 views
1

ich in den unten kompilieren Fehler renne:Persistent select verursacht Fehler "Typ konnte nicht übereinstimmen 'BaseBackend backend0' mit 'SqlBackend'"

• Couldn't match type ‘BaseBackend backend0’ with ‘SqlBackend’ 
    arising from a use of ‘runSqlite’ 
    The type variable ‘backend0’ is ambiguous 
• In the expression: runSqlite ":memory:" 
    In the expression: 
    runSqlite ":memory:" 
    $ do { records <- selectList [UserUsername ==. "abc"] [LimitTo 10]; 
      liftIO $ print (records :: [Entity User]) } 
    In an equation for ‘selectAll’: 
     selectAll 
     = runSqlite ":memory:" 
      $ do { records <- selectList [UserUsername ==. "abc"] [LimitTo 10]; 
       liftIO $ print (records :: [Entity User]) } 

Code:

selectAll :: IO() 
selectAll = runSqlite ":memory:" $ do 
    records <- selectList [UserUsername ==. "abc"] [LimitTo 10] 
    liftIO $ print (records :: [Entity User]) 

Having ein Blick auf die Art Signatur von runSqlite:

runSqlite  
:: (MonadBaseControl IO m, MonadIO m, IsSqlBackend backend) 
=> Text 
-> ReaderT backend (NoLoggingT (ResourceT m)) a 
-> m a 

ich gehe davon brauche ich einen expliziten Typ für runSq angeben lite, obwohl ich nicht sicher bin, was ich für backend in ReaderT backend (NoLoggingT (ResourceT m)) a eingestellt habe?

+0

Das sollte funktionieren, können Sie den gesamten Code veröffentlichen? – Sibi

Antwort

1

Sie können es unter SqlBackend spezialisieren.

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

selectAll :: IO() 
selectAll = runSqlite ":memory:" . asSqlBackendReader $ do 
    records <- selectList [UserUsername ==. "abc"] [LimitTo 10] 
    liftIO $ print (records :: [Entity User]) 

bei der Art der runSqlite suchen, gibt es eine Beschränkung IsSqlBackend backend zu befriedigen.

Die Definition von IsSqlBackend ist:

type IsSqlBackend backend = 
    (IsPersistBackend backend, BaseBackend backend ~ SqlBackend) 

Dann IsPersistBackend nachzuschlagen.

Direkt unter der Definition der Klasse, sehen wir, dass es drei Instanzen hat:

instance IsPersistBackend SqlWriteBackend 
instance IsPersistBackend SqlReadBackend 
instance IsPersistBackend SqlBackend 

Die drei Typen Backends mit verschiedenen Fähigkeiten angeben, mit SqlBackend sind die allgemeinste eines (unbekannte Fähigkeiten). Fühlen Sie sich frei, eine eingeschränkter zu verwenden, wenn das alles ist, was Sie brauchen.

+0

Könnten Sie möglicherweise eine Ressource vorschlagen, um diese Antwort zu verstehen? Vielen Dank! –

+1

Ich änderte meine Antwort, um beschreibender zu sein. Ich habe keine bestimmte Ressource im Kopf, die den Prozess auf einer höheren Ebene erklärt. –

Verwandte Themen