
Hello. I have some problem with catching error. My function try to read value from string and if it's fails - return default (d). With this:
import Control.Exception readIOWith :: Read a => a -> String -> IO a readIOWith d x = catch tryRead errHandler where errHandler :: SomeException -> IO a errHandler _ = return d tryRead = readIO x
I have error: Could not deduce (a ~ a1) from the context (Read a) bound by the type signature for readIOWith :: Read a => a -> String -> IO a at BWClub/Common/Helpers/Packets.hs:(19,1)-(22,33) `a' is a rigid type variable bound by the type signature for readIOWith :: Read a => a -> String -> IO a at BWClub/Common/Helpers/Packets.hs:19:1 `a1' is a rigid type variable bound by the type signature for errHandler :: SomeException -> IO a1 at BWClub/Common/Helpers/Packets.hs:21:11 In the first argument of `return', namely `d' In the expression: return d In an equation for `errHandler': errHandler _ = return d But this code works:
readIOWith d x = catch tryRead (\e -> print (e :: SomeException) >> return d) where tryRead = readIO x
Sorry for my english.