Samppi,

Good work on figuring that out. It's by working through those kinds of
problems that you really learn about monads. It is indeed the case
that not all monads have m-zero and m-plus defined for them. The state-
m monad is one of those. Not only that, but if you take a look at the
state-t monad transformer, you'll see m-zero defined like this:

m-zero   (with-monad m
                      (if (= ::undefined m-zero)
                           ::undefined
                          (fn [s]
                               m-zero)))

Notice that when you combine the state-m monad with another monad
using state-t, an m-zero for the resulting monad is only defined if
the original monad had an m-zero. Also notice that when an m-zero is
defined for the original monad, the new m-zero is a function that
accepts a state and returns the original m-zero without regard to the
state that was passed in. And that's where your original monad ran
into problems, you tried to make the new m-zero's return value
dependent on the state that was passed in.

Furthermore, it's hard to see it, but :when clauses in domonad require
that m-zero exists, and obeys the monad laws for zero and plus. So if
you're m-zero is incorrect, :when clauses won't work either.

At this point, you need to drop back and understand exactly what
you're trying to accomplish and make sure you really understand monads
as fully as possible. I just spent almost 2 weeks working on my own
monad for writing web applications. I finally gave up and sat down to
really learn how the continuation monad works. After that, I
discovered I could use it instead of writing my own and it turned out
to be very easy. Very often, you can come up with something that
almost works and think that it just needs one more tweak to get it
right. That's what happened to me and I wasted a lot of effort before
I finally tossed it out and really focused on understanding.

If you'd like to post details of what you're doing, I'd guess some
folks would lend some assistance.

Jim


On Nov 22, 11:04 am, samppi <rbysam...@gmail.com> wrote:
> Thanks for the help.
>
> After working it out, I just figured out that the reason why the
> second axiom isn't fulfilled by the m-zero above is this part in m-
> bind:
>                        ((product-fn product) new-state))))))
>
> product-fn, which in the second axiom's case is (fn [x] m-zero), gets
> called and becomes m-zero, which is in turn called on new-state, not
> the old state.
>
> I cannot figure out at all, though, what m-zero *is* valid under both
> axioms. Now I don't see how it's simply possible at all—are there
> monads for which there is no value of m-zero, and is this one of them?
>
> On Nov 21, 9:02 pm, jim <jim.d...@gmail.com> wrote:
>
> > Glad you found that tutorial useful. I had to run this morning, so I
> > couldn't really reply. I'll try to read your post more closely
> > tomorrow and see if I can offer any useful insight.
>
> > Jim

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to