It is polymorphic indeed. Summation of the elements of an integer list is similar. Again, no casts are used. Throughout the discussion thread I was puzzled by how much we can argue about the matter that we all basically agree upon. A type is a set, or a membership function.
Languages differ in ways they decompose type membership functions into the two parts.
The motivation to answer the challenges was to illustrate that it is possible to decompose the type function of polymorphic lists in such a way that the compile-time part will be in the perfect agreement with the C type system. The exercise also showed just how hard it is to program in C without explicit or implicit casts. The present page is a compilation of three articles posted on comp.lang.functional on Sep 29 and Oct 1 and 2, 2000. Luca Cardelli, P. Wegner, On Understanding Types, Data Abstraction, and Polymorphism.