A generic version of Data.Maybe