There's a long-known technique in functional languages where [x1,...,xn] => \tail -> x1:...xn:tail xs ++ ys => f . g xs => f [] A correspondent mentioned to me that he couldn't find a reference to the idea (which I gather he had independently rediscovered). I know I've read about it somewhere. Can anyone provide a reference?