Jonathan Cast wrote:
On Thu, 2008-10-02 at 18:18 +0100, Andrew Coppin wrote:
After an insane amount of time making my head hurt, I disocvered that
the type "Either ErrorType (ResultSet State)" is actually a monad.
It's a monad if you can write a function
join :: Either ErrorType (ResultSet (Either ErrorType (ResultSet alpha)))
-> Either ErrorType (ResultSet alpha)
(which follows from being able to write a function
interleave :: Either ErrorType (ResultSet alpha)
-> ResultSet (Either ErrorType alpha)
satisfying certain laws). Otherwise not, as you noticed.
Er... OK. Yes, I guess that kind of makes sense...
Since ResultSet *just happens* to also be in Functor,
It doesn't just happen to be one. liftM is *always* a law-abiding
definition for fmap, when used at a law-abiding monad.
I'm lost...
(What does liftM have to do with fmap?)
(This is why
posters here are always bringing up head-hurting category theory, btw.
Absorbing it sufficiently actually teaches you useful things about
Haskell programming.)
That would be a surprising and unexpected result. After all, knowing
about set theory doesn't help you write SQL...
At this point I am sorely tempted to just change ResultSet to include
the error functionallity I need. However, ResultSet is *already* an
extremely complicated monad that took me weeks to get working
correctly...
What does it look like?
A list, basically. (But obviously slightly more complicated than that.)
Quite possibly it can be factored out into
smaller pieces using monad transformers. (In which case adding error
handling is just sticking in another transformer at the right layer in
the stack --- that is, the layer where adding error handling works :).
Well I'm *already* trying to layer an error transformer on the top and
it's failing horribly. I don't see how splitting things up even more
could do anything but make the program even *more* complex.
Does anybody have any idea how this whole monad stacking craziness is
*supposed* to work?
No. [1]
Ah, good. :-)
But we know how it *can* work; this is what monad transformers exist to
do. You want to either change ResultSet to be a monad transformer,
or
you want the monad ErrorT ErrorType ResultSet. Very little can be said
in general without knowing what ResultSet looks like.
I thought ErrorT was a class name...?
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe