
On Jan 15, 2008, at 7:34 PM, Brandon S. Allbery KF8NH wrote:
On Jan 15, 2008, at 22:05 , Adam Smyczek wrote:
Ups, resend, first response did not make into the list. On Jan 14, 2008, at 9:33 PM, Brandon S. Allbery KF8NH wrote:
On Jan 15, 2008, at 0:28 , Adam Smyczek wrote:
It's probably a trivial question, but I cannot figure out how to implement the catchError function in:
instance MonadError String Shell where throwError = error . ("Shell failed: "++) catchError l h = ???
Take a look at Control.Exception.catch for starters.
No, did not help and going over the source code of Control.Monad.Error did not help as well. Does someone have other tips for me?
Perhaps you could explain what you're looking for? Your typeclass doesn't tell us anything about the semantics.
The type declaration: newtype Loader a = Loader { load :: ErrorT String IO a } deriving (Functor, Monad, MonadIO) instance MonadError String Loader where throwError = error . ("Error: " ++) l `catchError` h = ??? how do I implement this ??? -- Example usage data Attribute = Attribute { a_name :: Name, a_value :: Value } deriving Show -- Find a required attribute by name and throw an -- exception it if does not exist findRequired :: Name -> [Attribute] -> Loader Attribute findRequired n as = case find (\a -> a_name a == n) as of Just a -> return a Nothing -> throwError $ "Missing required '" ++ n ++ "' attribute!" -- I would like to use catchException for -- findOptional and provide default value -- if findRequired fails findOptional :: Name -> [Attribute] -> Value -> Loader Attribute findOptional n as defaultValue = catchError (findRequired n as) (\_ -> return $ Attribute n defaultValue) As you probably can see on this code, I'm a haskell newbie and open for all tips how to improve this code. Thanks, Adam
-- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery@kf8nh.com system administrator [openafs,heimdal,too many hats] allbery@ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH