Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Path: utzoo!utgpu!water!watmath!watcgl!kdmoen
From: kdmoen@watcgl.UUCP
Newsgroups: comp.lang.misc
Subject: Polymorphic Type Systems: some unsolved problems
Message-ID: <1506@watcgl.waterloo.edu>
Date: Thu, 23-Jul-87 23:38:56 EDT
Article-I.D.: watcgl.1506
Posted: Thu Jul 23 23:38:56 1987
Date-Received: Sat, 25-Jul-87 11:21:10 EDT
Reply-To: kdmoen@watcgl.UUCP (Doug Moen)
Organization: U of Waterloo, Ontario
Lines: 52

I've been researching strongly typed, polymorphic languages for my thesis.
Although the problems of defining such polymorphic functions as 'identity'
(which maps a value of any type onto itself) and 'sort' (which sorts
an array of any length and any base type) are well understood,
it seems to me that there are many interesting and well defined
polymorphic functions which cannot be easily expressed in currently
existing polymorphic type systems.

Here is a partial list of difficult to define polymorphic functions.
I would greatly appreciate additions to this list, or sample code
that shows how to define any of these functions in your favourite
strongly typed, polymorphic programming language.

1) Write a single function 'twice' such that
      twice(f, x) = f(f(x))
   for any function f and value x for which this makes sense.

2) Define a function similar to the 'printf' function in the C
   library, except that it is fully type checked.

3) Define a function 'apply' such that
      apply(f, arglist)
   calls the function 'f' with 'arglist' as an argument list,
   for any function f, and any argument list that can legal be
   passed to it.

4) Define a function called 'curry' which maps functions onto functions.
   Curry maps functions with 0 or 1 arguments onto themselves,
   and maps functions with 2 or more arguments onto Curried versions
   of these functions.  For example, it maps a function of type
   "(T1, T2) -> R" onto a function of type "T1 -> T2 -> R". Similarly, it maps
   "(T1, T2, T3) -> R" onto "T1 -> T2 -> T3 -> R", etc.

5) Define a function called 'uncurry' which is more or less the inverse
   of curry.

6) Suppose that 'array N of T' is the type of a one dimensional array
   of N elements of type T.  Define a polymorphic function that
   can accept an argument with one of the following types:
      T
      array N1 of T
      array N1 of (array N2 of T)
      array N1 of (array N2 of (array N3 of T))
      ...etc, ad infinitum

7) Define a single function that can accept an argument whose type
   is either T1 or T2.
-- 
Doug Moen
University of Waterloo Computer Graphics Lab
UUCP:     {ihnp4,watmath}!watcgl!kdmoen
INTERNET: kdmoen@cgl.waterloo.edu