[Haskell-cafe] State Monad

Bernard Pope bjpop at cs.mu.OZ.AU
Wed Mar 2 20:55:16 EST 2005


On Thu, 2005-03-03 at 02:03 +0100, Sam G. wrote:
> I need a Monad to represent an internal stack. I mean I've got a lot of functions which operates on lists and I would not like to pass the list as an argument everytime. 
> 
> Could you help me writing this monad? To start, I just need a + function which will return the sum of the 2 toppest elements of the stack.
> 
> Thanks in advance,
> Sam.

Here's a little program for you to ponder over.
Cheers,
Bernie.


import Control.Monad.State

type Stack a = [a]

push :: a -> Stack a -> Stack a
push x s = x:s

peek :: Stack a -> Maybe a
peek (x:_) = Just x
peek other = Nothing

multTopTwo :: Num a => Stack a -> Stack a
multTopTwo (x:y:rest)
   = x * y : rest
multTopTwo other = other

type StateStack a = State (Stack Int) a

pushList :: [Int] -> StateStack ()
pushList [] = return ()
pushList (x:xs)
   = (modify $ push x) >> pushList xs

prog :: [Int] -> StateStack (Maybe Int)
prog xs
   = do pushList xs
        modify multTopTwo
        gets peek

main = print $ evalState (prog [1..5]) []



More information about the Haskell-Cafe mailing list