
hi ron, here are the relations between the two formulations of monads: (using haskell notation) map f m = m >>= (return . f) join m = m >>= id m >>= f = join (fmap f m) there are quite a few general concepts that you need to understand in what sense monads are monoids, but to understand how monads work you don't need to know that. Ron de Bruijn wrote:
I am pretty sure, that >>= is to monads what * is to for example natural numbers, but I don't know what the inverse of >>= is. And I can't really find it anywhere on the web(papers, websites, not a single sole does mention it.
this is not quie correct. (join & return) for a monad are like (*,1) or (+,0) for the set of integers. however those operations on integers have more structure than join and return. there is no operation for "inverse". in mathematical terms: monads are a monoid (given that the notion is generalized considerably from its usual use), and not a group. if one was to add such an operation (i am not sure what it would do), but it would be of type: inverse :: M a -> M a (and of course must satisfy some laws) also while you are pondering these things, it may be useful to use the "backward join" (=<<) :: (a -> m b) -> (m a -> m b). the reason for that is that strictly speaking tha arrow in the middle is different from the left and the right arrows i am not sure how useful this information is for you, but if you have more questions ask away -iavor
It should have type, at least that's what I think: inv::M a->M b
I say this, because I find this definition of a multiplication operation:
1. There exists a unique special element called neutral such that the operation on any element and the neutral does not change the element. 2. For every element there exists an inverse such that the operation on an element and its inverse is always neutral. 3. The operation is associative: it does not matter how you apply the operation to three elements. You may apply it to the first two and then to the result and the third element. Or you may first apply the operation to the last two and then to the first and the result of the previous operation.
An operation may also be commutative
4. The order of two elements in operation is not important.
According to 2 there should be an inverse. For join such an inverse is simple: to apply the type constructor on the monad. But I tried to somehow link it with bind, but than the types don't seem to match. So to be concrete: what's the inverse of bind?
If I did make some errors, please tell me so.
__________________________________ Do you Yahoo!? Friends. Fun. Try the all-new Yahoo! Messenger. http://messenger.yahoo.com/ _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe