[Haskell-cafe] state and exception or types again...

Brian Hulley brianh at metamilk.com
Mon Aug 28 16:28:02 EDT 2006


Andrea Rossato wrote:
>
> Now I'm trying to create a statefull evaluator, with output and
> exception, but I'm facing a problem I seem not to be able to
> conceptually solve.
>
> data Eval_SOI a = Raise { unPackMSOIandRun :: State -> (a, State,
>                Output) } | SOIE { unPackMSOIandRun :: State -> (a,
> State, Output) }

If you instead consider that you want the wrapped function to evaluate to a 
result that allows you to continue, or a result that is an exception, then 
you could use a flag to record whether or not an exception occurred eg:

data Eval_SOI a = SOIE {runSOIE :: State -> (a, State, Output, Bool)}

where the 4th element of the tuple is True iff we can continue or False iff 
an exception occurred.

>
> raise x e = Raise (\s -> (x,s,e))
>

raise x e = SOIE {\s -> (x, s, e, False)}

instance Monad Eval_SOI where
    return a = SOIE (\s -> (a, s, "", True))

    m >>= f = SOIE $ \x ->
        let
             r1@(a, y, o1, ok1) = runSOIE m x
        in  if ok1
            then
                let
                     (b, z, o2, ok2) = runSOIE (f a) y
                in (b, z, o1 ++ o2, ok2)
            else r1

ie if runSOIE m x does not result in an exception then we continue with the 
second computation otherwise we just return the exception (r1) immediately.

Note I have not tested the above code so it may have a bug in it (also I 
renamed s1 and s2 to o1 and o2 to avoid confusion with the use of "s" to 
mean "state")...

Regards, Brian.
-- 
Logic empowers us and Love gives us purpose.
Yet still phantoms restless for eras long past,
congealed in the present in unthought forms,
strive mightily unseen to destroy us.

http://www.metamilk.com 



More information about the Haskell-Cafe mailing list