Here's a very short (and rather unreadable) stack implementation that behaves exactly the same. Notice how we don't have to declare the types of the functions. Haskell figures them out for us!
module Stack (Stack, emptyStack, push, pop, top, size, listToStack, isElement, mapStack, reverseStack, partitionStack) where import List import Maybe data Stack a = St [a] listToStack = St emptyStack = St [] push (St s) = St . (flip (:)) s mapStack f = St . map f . stackToList reverseStack = St . reverse . stackToList isElement s = isJust . (flip find) (stackToList s) . (==) isEmpty = null . stackToList top = head . stackToList size = length . stackToList pop (St (h:t)) = (h, St t) pop _ = error "Attempt to pop an empty stack." partitionStack f (St s) = (\(a1, a2) -> (St a1, St a2)) $ partition f s -- Helper function: stackToList :: Stack a -> [a] stackToList (St s) = s