[web-devel] [Yesod] [Persistent] PersistBackend and the ErrorT monad

Max Cantor mxcantor at gmail.com
Wed Aug 24 12:17:25 CEST 2011


0.5.1.  sorry for forgetting to mention.

max

On Aug 24, 2011, at 6:09 PM, Michael Snoyman wrote:

> Is this on Persistent 0.5 or 0.6?
> 
> On Wed, Aug 24, 2011 at 12:33 PM, Max Cantor <mxcantor at gmail.com> wrote:
> Hi,
> 
> I am trying to use an ErrorT monad inside some Persist code.
> 
> I wrote the following instance:
> 
> newtype OcrError = OE String
> ...
> instance PersistBackend m => PersistBackend (ErrorT OcrError m) where
>  replace      k v = lift $ replace     k v
>  update       k l = lift $ update      k l
>  updateWhere  f u = lift $ updateWhere f u
>  delete       = lift . delete
>  insert       = lift . insert
>  deleteBy     = lift . deleteBy
>  deleteWhere  = lift . deleteWhere
>  get          = lift . get
>  getBy        = lift . getBy
>  count        = lift . count
>  selectKeys f = selectKeys f
>  selectEnum f o lim off = selectEnum f o lim off
> 
> It seems like there is a problem with selectEnum though.
> 
> In GHCI, this:
> 
> l :: [PersistKV OcrRefMap] <- rs $ selectEnum [] [] 0 0
> 
> works fine, while this:
> 
> l :: Either OcrError [PersistKV OcrRefMap] <- rs $ runErrorT $ selectEnum [] [] 0 0
> 
> hangs.  rs is a small function to run persist calls:
>  rs :: (MonadControlIO m) => SqlPersist m a -> m a
>  rs f = do
>    let conn = DT.pack "user=hachicode password=password host=localhost port=5432 dbname=hachicode"
>    withPostgresqlConn conn $ runSqlConn f
> 
> and you need -XScopedTypeVariables for the ghci commands.
> 
> Any advice?
> 
> Thanks,
> Max
> 




More information about the web-devel mailing list