Once Upon a Polymorphic Type

Similar documents
We handle arbitrary, user-dened algebraic data types (Section 6.4). Built-in data types are handled uniformly with user-dened ones, so there is no pen

Simon Peyton Jones Microsoft Research August 2013

Simon Peyton Jones Microsoft Research. August 2012

Polymorphic lambda calculus Princ. of Progr. Languages (and Extended ) The University of Birmingham. c Uday Reddy

Tracing Ambiguity in GADT Type Inference

Optimising Functional Programming Languages. Max Bolingbroke, Cambridge University CPRG Lectures 2010

Simple Unification-based Type Inference for GADTs

Type Systems, Type Inference, and Polymorphism

Uniqueness Typing Redefined

Urmas Tamm Tartu 2013

Adding GADTs to OCaml the direct approach

Arbitrary-rank polymorphism in (GHC) Haskell

CS152: Programming Languages. Lecture 11 STLC Extensions and Related Topics. Dan Grossman Spring 2011

Recursive Types and Subtyping

Programming Languages

4.5 Pure Linear Functional Programming

Let Arguments Go First

Haskell & functional programming, some slightly more advanced stuff. Matteo Pradella

Programming Languages Lecture 15: Recursive Types & Subtyping

Type Systems. Pierce Ch. 3, 8, 11, 15 CSE

Overloading, Type Classes, and Algebraic Datatypes

Lecture 2: SML Basics

Topics Covered Thus Far. CMSC 330: Organization of Programming Languages. Language Features Covered Thus Far. Programming Languages Revisited

CSE 505: Concepts of Programming Languages

COS 320. Compiling Techniques

CS-XXX: Graduate Programming Languages. Lecture 9 Simply Typed Lambda Calculus. Dan Grossman 2012

Types for References, Exceptions and Continuations. Review of Subtyping. Γ e:τ τ <:σ Γ e:σ. Annoucements. How s the midterm going?

CMSC 330: Organization of Programming Languages

Pawns: a declarative/imperative language

1. For every evaluation of a variable var, the variable is bound.

More Untyped Lambda Calculus & Simply Typed Lambda Calculus

Where is ML type inference headed?

Subsumption. Principle of safe substitution

Part III. Chapter 15: Subtyping

1. true / false By a compiler we mean a program that translates to code that will run natively on some machine.

Lecture #23: Conversion and Type Inference

Conversion vs. Subtyping. Lecture #23: Conversion and Type Inference. Integer Conversions. Conversions: Implicit vs. Explicit. Object x = "Hello";

Wellesley College CS251 Programming Languages Spring, 2000 FINAL EXAM REVIEW PROBLEM SOLUTIONS

Goal. CS152: Programming Languages. Lecture 15 Parametric Polymorphism. What the Library Likes. What The Client Likes. Start simpler.

Type Checking and Type Inference

Functional Programming

Types and Type Inference

Extended Static Checking for Haskell (ESC/Haskell)

The Worker/Wrapper Transformation

Simply-Typed Lambda Calculus

CSCI-GA Scripting Languages

Compiler Construction Lent Term 2015 Lectures 10, 11 (of 16)

CS 242. Fundamentals. Reading: See last slide

CS 11 Haskell track: lecture 1

Demonstrating Lambda Calculus Reduction

From IMP to Java. Andreas Lochbihler. parts based on work by Gerwin Klein and Tobias Nipkow ETH Zurich

Simple Usage Polymorphism Keith Wansbrough Λ Computer Laboratory University of Cambridge Cambridge CB2 3QG, England

1.1 Limitations in Turner et al.'s analysis Turner et al.'s analysis can handle simple cases of zero usage by use of structural rules similar to those

Modelling Unique and Affine Typing using Polymorphism

Compile-Time Garbage Collection for Lazy Functional Languages

Type checking. Jianguo Lu. November 27, slides adapted from Sean Treichler and Alex Aiken s. Jianguo Lu November 27, / 39

1 Introduction. 3 Syntax

Lecture 13: Subtyping

Review. CS152: Programming Languages. Lecture 11 STLC Extensions and Related Topics. Let bindings (CBV) Adding Stuff. Booleans and Conditionals

Types and Programming Languages. Lecture 5. Extensions of simple types

Sound Type-Dependent Syntactic Language Extension

Programming Languages Third Edition

n n Try tutorial on front page to get started! n spring13/ n Stack Overflow!

Uniqueness Typing Simplified

Static Contract Checking for Haskell

Lambda Calculus. Concepts in Programming Languages Recitation 6:

Programming Languages Lecture 14: Sum, Product, Recursive Types

Efficient Interpretation by Transforming Data Types and Patterns to Functions

FUNCTIONAL PEARLS The countdown problem

Overview. Elements of Programming Languages. Another example. Consider the humble identity function

Optimizing Closures in O(0) time

Tradeoffs. CSE 505: Programming Languages. Lecture 15 Subtyping. Where shall we add useful completeness? Where shall we add completeness?

Principles of Program Analysis: A Sampler of Approaches

CS4215 Programming Language Implementation. Martin Henz

On Meaning Preservation of a Calculus of Records

Lambda calculus. Wouter Swierstra and Alejandro Serrano. Advanced functional programming - Lecture 6

l e t print_name r = p r i n t _ e n d l i n e ( Name : ^ r. name)

3. Functional Programming. Oscar Nierstrasz

Pierce Ch. 3, 8, 11, 15. Type Systems

Consistent Subtyping for All

Part III Chapter 15: Subtyping

CS 6110 S11 Lecture 25 Typed λ-calculus 6 April 2011

Types and Type Inference

Principles of Programming Languages

Functional Languages. Hwansoo Han

CMSC 336: Type Systems for Programming Languages Lecture 5: Simply Typed Lambda Calculus Acar & Ahmed January 24, 2008

Lesson 4 Typed Arithmetic Typed Lambda Calculus

CS-XXX: Graduate Programming Languages. Lecture 17 Recursive Types. Dan Grossman 2012

More Lambda Calculus and Intro to Type Systems

CS The IO Monad. Slides from John Mitchell, K Fisher, and S. Peyton Jones

Type Systems. Parametric Polymorphism. 1. Recall Let-Polymorphism. 1. Recall Let-Polymorphism. Lecture 9 Dec. 15th, 2004 Sebastian Maneth

6.821 Programming Languages Handout Fall MASSACHVSETTS INSTITVTE OF TECHNOLOGY Department of Electrical Engineering and Compvter Science

Transformation and Analysis of Haskell Source Code

Harvard School of Engineering and Applied Sciences Computer Science 152

More Lambda Calculus and Intro to Type Systems

Simon Peyton Jones Microsoft Research August 2012

Types, Type Inference and Unification

Recursive Types and Subtyping

Foundations. Yu Zhang. Acknowledgement: modified from Stanford CS242

Modular, Higher-Order Cardinality Analysis in Theory and Practice

Transcription:

Once Upon a Polymorphic Type Keith Wansbrough Computer Laboratory University of Cambridge kw217@cl.cam.ac.uk http://www.cl.cam.ac.uk/users/kw217/ Simon Peyton Jones Microsoft Research Cambridge 20 January, 1999 Once Upon a Polymorphic Type (full version) 1 20 January, 1999

Why usage analysis? Problem: Lazy evaluation (call-by-need) is useful but slow Solutions: Strictness analysis: convert call-by-need to call-by-value Usage analysis: convert call-by-need to call-by-name Once Upon a Polymorphic Type (full version) 2 20 January, 1999

Lazy evaluation let x = 3 + 4 y = 5 + 6 Heap, before and after: in x + x + y unnecessary update x : 3 + 4 x : 7 y : 5 + 6 y : 11 Unnecessary updates mean excess memory traffic. Once Upon a Polymorphic Type (full version) 3 20 January, 1999

The goal Identify variables and subexpressions that will be evaluated at most once. Once Upon a Polymorphic Type (full version) 4 20 January, 1999

Usage analysis enables other optimisations too Inlining: y : case e of let x = e in y : case x of : : :! : : : : : :! : : : Here x occurs in none of the case alternatives. We avoid constructing a thunk for x entirely, by inlining e. Always valid, but serious slow-down if lambda applied more than once; work-safe if lambda applied (used) at most once. Several other optimisations can similarly benefit from usage information. Once Upon a Polymorphic Type (full version) 5 20 January, 1999

Plan of attack Haskell source Desugar Core Core-to-Core transforms Usage inference Code generation C / Assembler Usage inference provides additional information at Core level to guide optimising transformations and code generation. Once Upon a Polymorphic Type (full version) 6 20 January, 1999

How do we do it? It seems that we should simply be able to count syntactic occurrences. But this is not enough. let y = 1 + 2 in let f = x : x + y in f 3 + f 4 Here y appears once in its scope. But it is used twice, once for each call to f. The usage of y depends on the usage of f. Once Upon a Polymorphic Type (full version) 7 20 January, 1999

42 : Int! x : Int 1 : x : (Int 1! Int 1 )! x : Int 1 : y : Int 1 : x + y : (Int 1! (Int 1! Int! ) 1 )! in x + x + y : Int! Types We represent usage information in the types of expressions: let x : Int! = 3 + 4 y : Int 1 = 5 + 6 Once Upon a Polymorphic Type (full version) 8 20 January, 1999

Type syntax Types ::= T k (unannotated) j 1! 2 8 : j j ::= Types u (annotated) u ::= 1 j! Usages for example, (List Int) 1! Int!!. Once Upon a Polymorphic Type (full version) 9 20 January, 1999

` e 1 : Int u 1 ` e 2 : Int u 2 ` e 1 + e 2 : Int u 3 Type rules Type judgements are of the form ` e : context expression type For example, the rule for addition: (`-PrimOp) Once Upon a Polymorphic Type (full version) 10 20 January, 1999

` x : 1 : e : ( 1! 2 ) u in f 3 + f 4 : Int! Type rules for UsageSP 1: Functions ; x : 1 ` e : 2 (multiple occurrence) e) > 1 ) j 1 j =! occur(x; e) > 0 ) j (y)j u for all y 2 (free variables) occur(y; (`-Abs) occur(; ) is defined syntactically. let y : Int! = 1 + 2 in let f : (Int 1! Int 1 )! = x : Int 1 : x + y Here occur(x; x + y) = 1, occur(y; x + y) = 1, occur(f; f 3 + f 4) = 2. Once Upon a Polymorphic Type (full version) 11 20 January, 1999

Three design decisions Should type variables be annotated or unannotated? What is the usage of a type abstraction? Type polymorphism: How should constructor applications be typed? Algebraic data structures: How can we avoid equating usages of all arguments to a common function? The poisoning problem: Once Upon a Polymorphic Type (full version) 12 20 January, 1999

Design decision 1: Type polymorphism Should type arguments be annotated or unannotated? Range of type variables: f : (8 :! (! (; ; ) 1 ) 1 )! or f : (8 : 1! (!! (; ; ) 1 ) 1 )!? Given ` e : u, what is ` : e :? Type of type abstractions: Once Upon a Polymorphic Type (full version) 13 20 January, 1999

` e : (8 : 2 ) u ` e 1 : ( 2 [ := 1 ]) u Type rules for UsageSP 3: Type polymorphism Type abstractions and applications are treated as transparent for the purposes of usage annotation, since operationally they have no significance. These rules simply lift and lower the usage annotation. ` e : u ; (`-TyAbs) ` : e : (8 : ) u (`-TyApp) Once Upon a Polymorphic Type (full version) 14 20 January, 1999

j Leaf Design decision 2: Data structures Our language features user-defined algebraic data types such as data Tree = Branch (Tree ) (Tree ) How should these be typed? Once Upon a Polymorphic Type (full version) 15 20 January, 1999

Branch : 8 : (Tree )?! (?! ((Tree )?! (Tree )? )? )? Data structures: First attempt If we treat data constructors as normal functions, what usages should we place on the arguments and result? To make Branch universally applicable, we must set? =!. : : : inaccurate. The usages? really depend on how the constructed data is used, not on the constructor itself. Once Upon a Polymorphic Type (full version) 16 20 January, 1999

let f : (Int!! (Int!! (Int; Int) 1 )! )! = x : Int! : y : Int! : let p = : : : f = : : : q The tantalising opportunity in (p; q) in case f x y of (p; q)! p + q Each component of the pair returned by f is used only once. Hence p and q need not be updated on evaluation. How can we propagate this information from the usage site (the case expression) to the construction site in f? Once Upon a Polymorphic Type (full version) 17 20 January, 1999

((; ) Int 1 Int 1 ) u (Branch (Tree! 1! 1 Int)! Int 1 (Tree! 1! 1 Int)! ) u Data structure usage propagation 1 We propagate usage information through the type of the constructed data. There are a number of alternatives here. data Pair = (; ) data Tree = Branch (Tree ) (Tree ) j Leaf 1. Give usage annotations for each constructor argument explicitly in the type: (; ) 1 1 Int Int 3 4 Branch! 1! 1 Int t 1 3 t 2 (typical application) j (Leaf Int 1 ) u (effective type) This is the most general approach, but it is expensive. Once Upon a Polymorphic Type (full version) 18 20 January, 1999

(; ) Int 1 Int 1 3 4 Branch Int 1 t 1 3 t 2 ((; ) Int 1 Int 1 ) u (Branch (Tree Int 1 )? Int 1 (Tree Int 1 )? ) u j (Leaf Int 1 ) u (; ) Int Int 3 4 Branch Int t 1 3 t 2 ((; ) Int! Int! ) u (Branch (Tree Int)! Int! (Tree Int)! ) u j (Leaf Int! ) u Data structure usage propagation 2 2. Attach usage annotations to each type argument [BS96]: 3. Assume all constructor arguments will be used more than once. Once Upon a Polymorphic Type (full version) 19 20 January, 1999

(; ) Int Int 3 4 Branch Int t 1 3 t 2 ((; ) Int u Int u ) u (Branch (Tree Int) u Int u (Tree Int) u ) u j (Leaf Int u ) u Data structure usage propagation 3 4. Identify usage annotations for each constructor argument with the overall usage of the constructed data. We choose this solution because it catches the common cases but costs relatively little in terms of implementation. Once Upon a Polymorphic Type (full version) 20 20 January, 1999

data T k = C i ij ` C i k e j : (T k ) u data T k = C i ij ` e : (T k ) u Type rules for UsageSP 4: Data structures ` e j : 0 ij 0 ij 4 ( ij[ k := k ]) u for all j (`-Con) ` e i : 0 i 0 i 4 (( ij[ k := k ]) u! ) 1 for all i (`-Case) ` case e of C i! e i : Once Upon a Polymorphic Type (full version) 21 20 January, 1999

let f : (Int?! Int 1 )! Design decision 3: The poisoning problem f = x : Int? : x + 1 : Int! a = 2 + 3 a : Int? b = 5 + 6 b in a + (f a) + (f b)? =! : : : bad for b? = 1 : : : bad for a How can we make this work? Once Upon a Polymorphic Type (full version) 22 20 January, 1999

let f : 8u : (Int u! Int 1 )! Solution A: Usage polymorphism f = u : x : Int u : x + 1 : Int! a = 2 + 3 a : Int 1 b = 5 + 6 b in a + (f! a) + (f 1 b) Here f is polymorphic in the usage of its first argument. It is applied once at usage!, and once at usage 1. Once Upon a Polymorphic Type (full version) 23 20 January, 1999

let f : (Int 1! Int 1 )! Solution B: Subsumption f = x : Int 1 : x + 1 : Int! a = 2 + 3 a : Int 1 b = 5 + 6 b in a + (f a) + (f b) Here f s type reflects its single use of its argument. An implicit subsumption rule allows the application of f (with argument type Int 1 ) to a (of type Int! ): Int! 4 Int 1. This is safe when thunks are self-updating. Once Upon a Polymorphic Type (full version) 24 20 January, 1999

` e 1 : ( 1! 2 ) u ` e 2 : 0 1 0 1 4 1 (`-App) 1 u1 4 2 u2, 1 4 2 and u 2 u 1 1! 2 4 3! 4, 3 4 1 and 2 4 4 Type rules for UsageSP 2: Subsumption Consider the rule for applications: ` e 1 e 2 : 2 We define the subtyping relation 1 4 2 by induction: : : : and so on. Once Upon a Polymorphic Type (full version) 25 20 January, 1999

Subsumption vs. usage polymorphism 1 We choose subsumption rather than usage polymorphism. In practice, usage polymorphism complicates the implementation and seems likely to bog the compiler down: Simple usage polymorphism is insufficient; bounded usage polymorphism is required. Two new productions, usage abstraction and application, must be added to the compiler s abstract syntax, along with corresponding support code. It is likely that many usage arguments will have to be passed at every function application. Once Upon a Polymorphic Type (full version) 26 20 January, 1999

apply : (8u 1 : 8u 2 : 8 : 8 : ( u 1! u2 ) 1! ( u 1! u2 ) 1 )! apply : (8 : 8 : (!!! ) 1! (!!! ) 1 )! Subsumption vs. usage polymorphism 2 Rejecting usage polymorphism loses expressivity. apply = f : x : f x With usage polymorphism, it has the type: NB! With subsumption, this dependency cannot be expressed, and we must choose a type such as the following: Once Upon a Polymorphic Type (full version) 27 20 January, 1999

Principal types vs. universal types We do not have principal types: apply : (8 : 8 : (!!! ) 1! (!!! ) 1 )! (1) apply : (8 : 8 : ( 1! 1 ) 1! ( 1! 1 ) 1 )! (2) These are incomparable. However, type (1) is universal, while type (2) is not: any well-(non-usage-)typed expression involving apply can be (usage-)typed with (1), but not necessarily with (2). Principal types could in principle be regained by introducing usage polymorphism. Once Upon a Polymorphic Type (full version) 28 20 January, 1999

in let f : (Int u 2! Int u3 ) u 4 in f 3 + f 4) u 6 Inference algorithm 1. Annotate program: (let y : Int u1 = 1 + 2 = x : Int u5 : x + y 2. Collect constraints: fu 4 =!; u 4 u 1 ; u 5 u 2 g 3. Find optimal solution: fu 1 7!!; u 2 7! 1; u 3 7! 1; 4 7!!; u 5 7! 1; u 6 7! 1g u A solution always exists (simply set all u i =!). We choose to maximise the number of 1 annotations, calling this the optimal annotation. Complexity is approx. linear in the size of the (typed) program. Once Upon a Polymorphic Type (full version) 29 20 January, 1999

Soundness Claim: Thunks marked 1 are used at most once. Proof strategy: 1. Provide an operational semantics expressing sharing and thunks. 2. Ensure evaluation becomes stuck if we use a thunk more than once. 3. Show well-typed programs never become stuck. Once Upon a Polymorphic Type (full version) 30 20 January, 1999

Operational semantics for UsageSP We base our operational semantics on Launchbury s natural semantics for lazy evaluation. A heap H is a set of named thunks fx : 1 7! e 1 ; y : 2 7! e 2 ; : : : g. A configuration hhi e is an expression e, possibly with free variables bound in the heap H. The judgement hh 1 i e + k hh 2 i v signifies that the initial configuration hh 1 i e evaluates to the final configuration hh 2 i v. ( k are type variables possibly free in e and v, to be explained later). Once Upon a Polymorphic Type (full version) 31 20 January, 1999

Thunk usage 1 When a variable is evaluated, its thunk is retrieved from the heap, evaluated, and the result returned. If the thunk is annotated!, we update the thunk with the resulting value: jj =! hh 1 i e + k hh 2 i v (+-Var-Many) hh 1 ; x : 7! ei x + k hh 2 ; x : 7! vi v Updated value Once Upon a Polymorphic Type (full version) 32 20 January, 1999

Thunk usage 2 But if the thunk is annotated 1, we remove the thunk from the heap entirely: jj = 1 hh 1 i e + k hh 2 i v (+-Var-Once) hh 1 ; x : 7! ei x + k hh 2 i v x removed! Thus if we attempt to use the thunk again (i.e., more than once), evaluation will become stuck. This rule formalises what we mean by using a thunk. Once Upon a Polymorphic Type (full version) 33 20 January, 1999

Proof of soundness 1 We must now prove that well-typed programs never become stuck. We prove this in two steps: 1. Subject reduction: well-typed configurations remain well-typed after one-step evaluation. 2. Progress: well-typed non-value configurations can always be further evaluated. Once Upon a Polymorphic Type (full version) 34 20 January, 1999

Proof of soundness 2 For this, we must define well-typed configuration. be able to convert well-typed programs to well-typed configurations. This suggests we should maintain types in our operational semantics. But in reality, at run time types are no longer present (our language does not have a typecase construct). This has interesting consequences for the operational semantics. Once Upon a Polymorphic Type (full version) 35 20 January, 1999

Preservation of types 1 For example (with and without types): x : 8 : Pair (! Int) (! Int) let let x = let y = v : 1 = : let y :! Int MkPair y y in = v : : 1 in (fst x) 3 + (fst x) True MkPair y y in in (fst (x Int)) 3 + (fst (x Bool)) True (fst x) 3 After is evaluated, the heap fx 7! MkPair y y; contains 7! v : 1g. Now the second use of x shares the same y. y A conventional semantics with : e a value does not permit this! We would lose sharing that is in fact present. What can we do? Once Upon a Polymorphic Type (full version) 36 20 January, 1999

hh 1 i : e + k hh 2 i 0 Preservation of types 2 We must permit evaluation under type lambdas. Transparency of type lambdas is reasonable since they do not appear at run time. This gives us the rules fresh 0 hh 1 i e[ := 0 ] + k ; 0 hh 2i v (+-TyAbs) : v hh 1 i e + k hh 2 i : v (+-TyApp) hh 1 i e + k hh 2 i v[ := ] Once Upon a Polymorphic Type (full version) 37 20 January, 1999

Preservation of types 3 But what type can we give to thunks such as y? x : 8 : Pair (! Int) (! Int) let = : let y :! Int = v : : 1 in MkPair y y (fst (x Int)) 3 + (fst (x Bool)) True in y used at Int y used at Bool We can t place it directly in the heap as y : (! Int) 7! v : : 1, as is then unbound. Nor can we instantiate it to Int, because it is later used at Bool. Once Upon a Polymorphic Type (full version) 38 20 January, 1999

Preservation of types 4 The solution is to abstract out any type variables we are currently evaluating under before placing bindings in the heap, giving us the thunk y : (8 :! Int) 7! : v : : 1. We could perform this as a source-to-source translation, giving: let x : 8 : Pair (! Int) (! Int) = : let y : 8 :! Int = : v : : 1 in MkPair (y ) (y ) in (fst (x Int)) 3 + (fst (x Bool)) True However, requiring this translation to be performed first is unnecessary. Once Upon a Polymorphic Type (full version) 39 20 January, 1999

hh 1 i letrec x i : i ui = e i in e + k Preservation of types 5 Instead of a source-to-source translation, we simply translate each thunk as we place it in the heap. fresh y i S = x j := y j k hh 1 ; y i : (8 k : i ) u i 7! k :e i [S]i e[s] + k hh 2 i v (+-LetRec) Each thunk is abstracted over the vector of type variables under which we are currently evaluating, and all references to that thunk are passed the actual type variables currently in use. hh 2 i v Notice that this vector of type variables is provided by the k annotation on + k. The (+-TyAbs) rule adds the bound type variable here each time we go inside a type lambda. Once Upon a Polymorphic Type (full version) 40 20 January, 1999

H = x i : i 7! e i i ; e) + P n j=1 occur(x i; e j ) > 1 ) j i j =! for all i occur(x Typing configurations Now we can type configurations. The rule is almost the same as for letrec: no k ; x j : j ` e i : 0 i 0 i 4 i for all i ; x j : j ; k ` e : ; k `Conf hhi e : (`-Conf) ; Here `Conf hhi e : k means that in context, while evaluating under type lambdas k, the H heap and the e expression are well-typed e and has type. Free type variables are not permitted in the heap. Once Upon a Polymorphic Type (full version) 41 20 January, 1999

Syntactic soundness proof Given this operational semantics, soundness is relatively straightforward to prove: 1. Convert +. to equivalent small-step reduction! rules 2. Observe that a well-typed program ` e : yields a well-typed initial configuration ; `Conf hi e :. 3. Demonstrate that for well-typed configurations, types are preserved by the reduction rules (subject reduction). 4. Demonstrate that well-typed non-value configurations can always be further reduced (progress). 5. Conclude evaluation never gets stuck, and therefore that we use a 1-annotated thunk at most once. 2 Once Upon a Polymorphic Type (full version) 42 20 January, 1999

Related work Non-type-based usage analysis: Goldberg; Marlow, Gill (GHC) Linear types (Girard et. al.), affine types (Jacobs et. al.) Type-based usage analysis: Clean (Barendsen et. al.): uniqueness analysis (dual to usage?); subsumption, data types, ML-polymorphism Turner, Mossin, and Wadler: Once Upon A Type extended by Mogensen: subsumption, data types extended by Gustavsson: update markers Once Upon a Polymorphic Type (full version) 43 20 January, 1999

Conclusion The problem: unnecessary updates. The solution: UsageSP : : : a type-based analysis for a realistic language that is efficiently computable and has been proven sound. Once Upon a Polymorphic Type (full version) 44 20 January, 1999

Future work Complete the implementation of the analysis in the Glasgow Haskell Compiler. Investigate strictness, absence, uniqueness analyses in the same framework. Investigate optimisations enabled by the analysis, and prove work-safety results for them. Once Upon a Polymorphic Type (full version) 45 20 January, 1999