[Haskell-cafe] Problem with own written monad

Michael Roth mroth at nessie.de
Mon Jan 7 09:33:51 EST 2008


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]) }

	push :: a -> Stack a
	push x = Stack f where f xs = ( x, x:xs )

	pop :: Stack a
	pop = Stack f where f (x:xs) = ( x, xs )

	top :: Stack a
	top = Stack f where f (x:xs) = ( x, x:xs )

	instance Monad Stack where
	  return x = Stack f where f xs = ( x, xs )
	  (>>=) stack g = Stack f where
	    f s0 = (x2, s2) where
	      (x1, s1) = run stack s0
	      (x2, s2) = run (g x1) s1

The errors:

./mymonad.hs:16:24:
    Couldn't match expected type `b' (a rigid variable)
           against inferred type `a' (a rigid variable)
      `b' is bound by the type signature for `>>=' at <no location info>
      `a' is bound by the type signature for `>>=' at <no location info>
      Expected type: [b] -> (b, [b])
      Inferred type: [a] -> (b, [b])
    In the first argument of `Stack', namely `f'
    In the expression: Stack f

./mymonad.hs:19:28:
    Couldn't match expected type `b' (a rigid variable)
           against inferred type `a' (a rigid variable)
      `b' is bound by the type signature for `>>=' at <no location info>
      `a' is bound by the type signature for `>>=' at <no location info>
      Expected type: [b]
      Inferred type: [a]
    In the second argument of `run', namely `s1'
    In the expression: run (g x1) s1


I think the problem is that my operator (>>=) is of type:

  Stack a -> (a -> Stack a) -> Stack a

but should be:

  Stack a -> (a -> Stack b) -> Stack b


But, I have simply no clue how to fix that. :-(
Can anybody give my a hint?


Thank you in advance.


Michael Roth





More information about the Haskell-Cafe mailing list