[comp.lang.functional] Conjunction-Type systems

ghosr@sersun0.essex.ac.uk (Ghosh-Roy R) (01/22/91)

-- Read the PhD thesis "M. Gerritsen, Type Assignment Functions" 1988.
-- University of Twente

-- She built a type inference algorithm where the occurrences of variables
-- not necessarily have the same type.
-- Instead she uses `conjuction types': *a & *b .
-- (\x.x o x) has the type ((*b->*c)&(*a->*b))->*a->*c which sais that x
-- must be
-- instantiatable as *a->*b and as *b->*c .
-- Application of (\x.x o x) to hd yields the equations:
-- *a->*b = List *d->*d  (and so: *a=List *d,   *b=*d)
-- *b->*c = List *e->*e  (and so: *b=List *e,   *c=*e)
-- The two occurrences of x have types List *d->*d and List *e->*e
-- respectively.
-- Solving the equations yields:
-- *a=List (List *e)
-- *b=List *e
-- *c=*e
-- *d=List *e
-- and so
-- (\x.x o x) hd::*a->*c = List (List *e)->*e
-- 
-- In this type inference system there is no more need for an explicit
-- let-construct.

The intersection systems were probably developed for the same reason!

-- All Milner-typable expressions are also typable in this scheme, but
-- some
-- non Milner-typable expressions too.
-- Try `twice twice k' where
-- twice f x = f (f x)
-- k x y = x
-- 
-- Mark Ramaer

I have a copy of the paper `Type Deduction Systems For Functional Languages' 
authored by Mirjam Gerritsen and Gerrit F van der Hoeven; this paper was
submitted to TAPSOFT-87. 

In all, 5 (ABCDE) systems were described using Conjunction-Types. The types 
assigned to

	Twice Twice :   (('b->'c) ^ ('a->'b)) -> ('d->'e).

	(\x.xx) Twice : (('b->'c) ^ ('a->'b)) -> ('d->'e).

Let us now define a function say,

	f x = [x], i.e., 	f : 'a -> 'a-list

Try `Twice Twice f' and one gets stuck since the type variables 'd or 'e
are completely independent from the domain variables. I believe that the 
unification procedure for Conjunction-Types described in the paper needs 
to be modified. Otherwise the system is the same as the intersection
systems without the `\omega' rule.

In GR system, the type assigned to

	Twice Twice :   (('a->'b) ^ ('b->'c) ^ ('c->'d) ^ ('d->'e)) -> ('a->'e).

	(\x.xx) Twice : (('a->'b) ^ ('b->'c) ^ ('c->'d) ^ ('d->'e)) -> ('a->'e).

Apply f to (Twice Twice) and you get ('a -> 'a-list-list-list-list) as
expected.

Try `Twice Twice Twice k' if you wish.

Rana

(0206) 87 22 97             (0206) 82 42 63         National
+ 44 206 87 22 97           + 44 206 82 42 63       InterNational
Room No.: 4B.526, Department of Computer Science, University of Essex 
Wivenhoe Park, Colchester Essex CO4 3SQ, England, UK (ghosr@essex.ac.uk)