Vorrei rilevare un'eccezione all'interno runResourceT senza rilasciare la risorsa, ma la cattura funzione di gestisce il calcolo all'interno IO. C'è un modo per rilevare un'eccezione all'interno di runResourceT o qual è il modo consigliato di ridefinire il codice?Come catturare un'eccezione all'interno runResourceT
Grazie per il vostro aiuto.
{-# LANGUAGE FlexibleContexts #-}
module Main where
import Control.Exception as EX
import Control.Monad.IO.Class
import Control.Monad.Trans.Resource
type Resource = String
allocResource :: IO Resource
allocResource = let r = "Resource"
in putStrLn (r ++ " opened.") >> return r
closeResource :: Resource -> IO()
closeResource r = putStrLn $ r ++ " closed."
withResource :: (MonadIO m
, MonadBaseControl IO m
, MonadThrow m
, MonadUnsafeIO m
) => (Resource -> ResourceT m a) -> m a
withResource f = runResourceT $ do
(_, r) <- allocate allocResource closeResource
f r
useResource :: (MonadIO m
, MonadBaseControl IO m
, MonadThrow m
, MonadUnsafeIO m
) => Resource -> ResourceT m Int
useResource r = liftIO $ putStrLn ("Using " ++ r) >> return 1
main :: IO()
main = do
putStrLn "Start..."
withResource $ \r -> do
x <- useResource r
{-- This does not compile as the catch computation runs inside IO
y <- liftIO $ EX.catch (useResource r)
(\e -> do putStrLn $ show (e::SomeException)
return 0)
--}
return()
putStrLn "Done."
Grazie per la risposta e commenti. Funziona come previsto e mi aiuta a capire meglio i trasformatori di monadi. – jedf