Re: [TYPES] Translation of bounded quantifications into intersection types

Giuseppe Castagna <[email protected]>
Newsgroups gmane.comp.science.types
Message-ID <[email protected]>
[ The Types Forum, http://lists.seas.upenn.edu/mailman/listinfo/types-list ]

On 12/11/18 3:18 PM, Stephen Dolan wrote:
>  This suggests a different
> definition of subtyping between polymorphic types: one polymorphic type is
> a subtype of another if the first has more instances. Equivalently, one
> polymorphic type is a subtype of another if for every instance of the
> second, there is an instance of the first which is a subtype. 

If you are interested in prenex polymorphism then let me point out the paper 
"Set-theoretic Foundation of Parametric Polymorphism and Subtyping" in ICFP '11 
(by Castagna & Xu) for a type system with union, intersection, and negation types.
There the subtyping relation is defined semantically: τ₁ ≤ τ₂ iff for all 
possible interpretations of the type variables the first type is interpreted in 
a subset of the second type. This in particular implies that for every type 
substitution σ, τ₁ ≤ τ₂ implies τ₁σ ≤ τ₂σ

In this system not only you have

     Bool → (α ∧ Real)  ≤  Bool → (α  ∧ Int)

but since you have "true" unions and intersections you can encode more general 
bounded polymorphism of the form

∀ τ₁≤ α ≤ τ₂. τ

as

∀ α . τ'

where τ' is obtained from τ by replacing every occurrence of α by ((τ₁v α) ∧ τ₂)

The system also shows new applications of bounded polymorphism when combined 
with negation types. For instance if you consider the function

fun x = if (x∈Int) then "ok" else x

then you want to give it the type

∀ α . (Int → String) ∧ (α\Int → α\Int)

that is, the type of a function that when applied to an integer it returns a 
string and when applied to an argument of any type that is not an integer 
returns a result of the same type (here / is the set-theoretic difference, i.e. 
τ₁/τ₂ = τ₁ ∧ ¬τ₂). We can express this type in bounded polymorphism as

∀ α ≤ ¬Int. (Int → String) ∧ (α → α)

Notice that this type is not weird. It is exactly the type of the "balance" 
function as defined by Okasaki for red-black trees in his book (you can find the 
annotated code in section 3.3 of our POPL 15 paper "Polymorphic Functions with 
Set-Theoretic Types: Part 2")


Finally, if you want to play with this kind of types, you can use the 
development version of CDuce.

   git clone https://gitlab.math.univ-paris-diderot.fr/cduce/cduce.git

use the cduce-next branch. In particular in the toplevel you can use two debug 
directives:

 > debug subtype τ₁ τ₂

that checks whether two types are in the subtyping relation and

 > debug tallying [ ] [τ₁ , τ₂ ; .... ; τ₁' , τ₂']

that returns a set of solutions (type substitutions) for the set of constraints 
{τ₁≤τ₂ ; .... ; τ₁'≤τ₂'}
(see #help debug for the syntax of debug directives and 
http://www.cduce.org/manual_types_patterns.html#syntax for the syntax of types)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.