This is the Haskell type declaration for "push":
push :: Stack a -> a -> Stack a
"::" should be read "Has-type". Once again, lower case letters in type signatures can be thought of as any type (in this case). So push has the type:
Stack a -> a -> Stack a
Its a function which takes a stack (of type "Stack a") and an element (of type "a"), and returns a new stack (of type "Stack a"). What are the types of the stack and the element? Haskell will derive the types (represented by "a") when you use this function.