-- Example Monad from Lecture 5A 2013, a stack. -- This is a special case of the State monad. ---------------- type Stack = [Int] newtype StackOp a = StackOp (Stack -> (a,Stack)) run :: StackOp a -> Stack -> (a,Stack) run (StackOp f) s = f s pop :: StackOp Int pop = StackOp $ \(x:xs) -> (x,xs) -- can fail push :: Int -> StackOp () push i = StackOp $ \s -> ((),i:s) add :: StackOp () add = StackOp $ \(x:y:xs) -> ((),x+y:xs) -- can fail emptyStack = [] -- (>>=) :: StackOp a -> (a -> StackOp b) -> StackOp b instance Monad StackOp where return n = StackOp $ \s -> (n,s) sop >>= f = StackOp $ \s -> let (i,s') = run sop s in run (f i) s' swap' :: StackOp () swap' = StackOp $ \s -> let (a,s') = run pop s (b,s'') = run pop s' (_,s''') = run (push a) s'' in run (push b) s''' swap = do a <- pop b <- pop push a push b