[Haskell-cafe] Specialize a function on types of arguments?
Olaf Klinke
olf at aatal-apotheke.de
Mon Nov 19 21:03:53 UTC 2018
>
> The top-level story is that I am trying to create a monad that somehow
> records the "intermediate steps" of computation.
>
If it is only for knowing where things went wrong, isn't that what the Either monad is for? The semantics of (Either YourErrorType) is that it returns `Right result' when all steps went through, and `Left errmsg' from the first place where something went wrong. You'd have to define YourErrorType to incorporate the relevant error information.
If you also want something like a call stack, i.e. a message like
"computation failed in step 3 with message: foo"
Then you need to stack a state transformer on top, e.g. StateT CallStack (Either YourErrorType) which decodes to
CallStack -> Either YourErrorType (resultType,CallStack)
An example using mtl transformers:
import Control.Monad.State.Strict
import Control.Monad.Except
type CallStack = (Int,[String])
type YourErrorType = String
type M a = StateT CallStack (Except YourError) a
fancyFunc :: Show a => (a -> b) -> (a -> M b)
fancyFunc f a = do
(n,stack) <- get
put (n+1,show a : stack)
return b
fancyMaybe :: Show a => (a -> Maybe b) -> (a -> M b)
fancyMaybe f a = do
(n,stack) <- get
case (f a) of
Nothing -> throwError $ "Failed at step "++(show n)++" on input "++(show a)
Just b -> do
put (n+1,show a : stack)
return b
runChainOfComputations = runStateT (1,[])
I once wrote a type 'ProvenienceT' which is a bit fancier than the above. It is a monadic EDSL and constructs a graph where nodes are (Markup of) intermediate steps of a computation and where edges are (user-supplied descriptions of) functions. It is inspired by the Javelin software of the 80s which pre-dates Excel spreadsheets. The result can be rendered as html. Can provide code if anyone is interested.
Cheers,
Olaf
More information about the Haskell-Cafe
mailing list