Michael Roth wrote:
Hello list,

while trying to learn the secrets of monads, I decided to write a simply
monand for pure educational purpose. But it turned out that it isn't as
easy as I thought... I circumnavigate quite a number of hurdles but now
I reached a point where I'm at a loss. :-(


The source:

        #! /usr/bin/env ghc

        data Stack a = Stack { run :: [a] -> (a, [a]) }

You want:

data Stack a b = Stack { run :: [a] -> (b, [a]) }

All monads have the property that they can represent calculations of values of any type. Without that, they're not so useful.

So your "Stack" needs two type variables : one for the kind of thing stacked, and one for what we're actually calculating at this instant.

The correct types for the other functions are:

        push :: a -> Stack a

push :: a -> Stack a ()

[you could have a -> Stack a a, if you want to echo back the pushed value, but why bother? ]

        pop :: Stack a

pop :: Stack a a

        top :: Stack a

top :: Stack a a

With those clues I think you will be able to write >>= and return more successfully!

There are some other interesting combinators to consider, like:

isolate :: Stack b x -> Stack a x
-- runs the computation with an empty stack, therefore
-- guaranteeing it does more pushes than pops

or

isolate :: Stack b x -> Stack a ([b],x)
-- if you want to collect the pushes.

and so on.

Jules
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to