
Okay, I want to write code in the Either monad in order to throw errors with logging. I did this a while ago but can't find my code and I forget what I did. Note that I'm using ghc 6.12.3, which I installed via the haskell platform. First question is: do I use Control.Monad.Error or Control.Monad.Either? Second question is: I want to have each monadic function within the stack of functions that is currently running catch the error and add some context to the log. For instance I need to have a function called, let's say, "catchAndAnnotate" that functions like the following. I'm just making this up-- how is it really done? func1 :: SomeType -> Either String SomeType func1 x = ("running in func1 with argument " ++ show x) `catchAndAnnotate` (do y <- somework x when (isBad y) (throwError "oops") return y) somework :: SomeType -> Either String SomeType somework x = ("running in somework with argument ++ show x) `catchAndAnnotate` (whatever x) whatever :: SomeType -> Either String SomeType whatever = ...