Or writing readable Haskell? Don't worry about wrapping and lifting: this is what the type checker is for. If you have a generalized operation, just name it similar to the closest library function. e.g.: head' ((t:_,_)) = t tail' ((_:ts,x)) = (ts, x) Then, when reading, one can focus on the meaning modulo the wrapping/lifting.