Michael Roth mroth at nessie.de
Mon Jan 7 18:30:57 EST 2008

```Jules Bean schrieb:

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

Thank you, that does the trick.

> The correct types for the other functions are:
>
> push :: a -> Stack a ()
> pop :: Stack a a
> top :: Stack a a
>
> With those clues I think you will be able to write >>= and return more
> successfully!

Yes, this was the missing link. Because I thought "Stack a a" could be
abbreviated using "Stack a" I run into these problems. This was also the
cause that "push" echoed back the pushed value.

> 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

Did you mean:

isolate :: Stack s1 a -> Stack s2 a
isolate stack = Stack f where f xs = ( fst \$ run stack [], xs)

> and so on.

Yes, I have done: push, pop, top, nop, count, clear, isolate and binop.
All pretty easy, once I understand that "Stack a b" thing.

```