Using Both Specialisation and Generalisation in a Programming Language: Why and How?