factor out Pure; default implementation of <*>
default implementation of fmap
maybe pattern matching