2016-04-04 26 views
1

Hizmetkârda bir silme işlemi gerçekleştirmek ve bir hata veya() döndürmek istiyorum.Tip uyuşmazlığı, mutlaka liftIO kullanmalı mıyım?

del :: Int -> ExceptT ServantErr IO() 
del myId = liftIO $ do 
    cn <- getConnection 
    a <- execute cn "delete from table1 where id = ?" [myId] 
    case a of 
    1 -> return() 
    _ -> throwE err503 --compile error 

hatadır: İşte benim kod

Couldn't match expected type ‘IO()’ 
       with actual type ‘ExceptT ServantErr m0 a0’ 
    In the expression: throwE err503 
    In a case alternative: _ -> throwE err503 
Ben eğer mümkünse her ifadenin öncesinde liftIO kullanmamayı tercih ediyorum

: O zamanlar bir hata döndürür nasıl

del myId = do 
    cn <- liftIO getConnection 
    a <- liftIO $ execute cn "delete from table1 where id = ?" [myId] 
    case a of 
    1 -> return() 
    _ -> throwE err503 

?

cevap

7

Bundan kaçınamayacağınızı düşünüyorum. her satır IO olmalıdır ilk

del :: Int -> ExceptT ServantErr IO() 
del myId = liftIO $ do ... 

ile çok do-blok Everthing, aynı monadın olmalıdır. Ancak, çeşitli şekillerde işleri düzenleyebilirsiniz, örn. Bir alt IO bazı şeyler bir araya geldiği bloğu ile: Control.Monad.unless ile

del myId = do 
    a <- liftIO $ do 
    cn <- getConnection 
    execute cn "delete from table1 where id = ?" [myId] 
    case a of 
    1 -> return() 
    _ -> throwE err503 

ya, de ki:

del myId = do 
    a <- liftIO $ do 
    cn <- getConnection 
    execute cn "delete from table1 where id = ?" [myId] 
    unless (a == 1) $ throwE err503 

ve diğer yollardan herhangi sayıda. Hangi getConnection ve execute kullandığınızı söylemiyorsunuz, ancak zaten MonadIO m => m .. olmadıklarından emin misiniz? Bu durumda liftIO'u ne zaman bırakabilirsiniz?

İlgili konular