module Stack (Stack, push, pop, top, isEmpty) where data Stack a= Stack [a] deriving (Show, Eq) empty :: Stack a empty = Stack [] push :: a-> Stack a-> Stack a push a (Stack s) = Stack (a:s) top :: Stack a-> a top (Stack []) = error "Stack: top on empty stack" top (Stack s) = head s pop :: Stack a-> Stack a pop (Stack []) = error "Stack: pop on empty stack" pop (Stack s) = Stack (tail s) isEmpty :: Stack a-> Bool isEmpty (Stack s)= null s