generalize map, map2, flatMap and unit