Type Systems for Programming Languages

36 downloads 163 Views 1014KB Size Report
Type Systems for Programming Languages. Benjamin C. Pierce bcpierce@cis. upenn.edu. Working draft of January 15, 2000. This is preliminary draft of a book  ...
Type Systems for Programming Languages Benjamin C. Pierce [email protected] Working draft of January 15, 2000

This is preliminary draft of a book in progress. Comments, suggestions, and corrections are welcome.

Contents Preface 1

8 . . . .

13 13 14 16 16

2

Mathematical Preliminaries 2.1 Sets and Relations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Induction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Term Rewriting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18 18 18 19

3

Untyped Arithmetic Expressions 3.1 Basics . . . . . . . . . . . . . Syntax . . . . . . . . . . . Evaluation . . . . . . . . . 3.2 Formalities . . . . . . . . . . Syntax . . . . . . . . . . . Evaluation . . . . . . . . . 3.3 Properties . . . . . . . . . . 3.4 Implementation . . . . . . . Syntax . . . . . . . . . . . Evaluation . . . . . . . . . 3.5 Summary . . . . . . . . . . . 3.6 Further Reading . . . . . . .

4

Introduction 1.1 What is a Type System? . . . . 1.2 A Brief History of Type . . . . 1.3 Applications of Type Systems 1.4 Related Reading . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

20 20 21 21 21 21 25 27 27 27 28 28 30

The Untyped Lambda-Calculus 4.1 Basics . . . . . . . . . . . . . . . . . . . Syntax . . . . . . . . . . . . . . . . . Operational Semantics . . . . . . . . 4.2 Programming in the Lambda-Calculus

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

31 32 33 34 34

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

1

. . . . . . . . . . . .

. . . . . . . . . . . .

4.3 4.4

4.5 5

6

7

Is the Lambda-Calculus a Programming Language? Formalities . . . . . . . . . . . . . . . . . . . . . . . . Syntax . . . . . . . . . . . . . . . . . . . . . . . . . Substitution . . . . . . . . . . . . . . . . . . . . . . Operational Semantics . . . . . . . . . . . . . . . . Summary . . . . . . . . . . . . . . . . . . . . . . . . Further Reading . . . . . . . . . . . . . . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

39 39 39 40 43 43 44

Implementing the Lambda-Calculus 5.1 Nameless Representation of Terms . . . Syntax . . . . . . . . . . . . . . . . . . Shifting and Substitution . . . . . . . . Evaluation . . . . . . . . . . . . . . . . 5.2 A Concrete Realization . . . . . . . . . . Syntax . . . . . . . . . . . . . . . . . . Shifting and Substitution . . . . . . . . Evaluation . . . . . . . . . . . . . . . . 5.3 Ordinary vs. Nameless Representations

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

45 45 46 48 49 49 50 50 51 51

Typed Arithmetic Expressions 6.1 Syntax . . . . . . . . . . . . . . . . . 6.2 The Typing Relation . . . . . . . . . 6.3 Properties of Typing and Reduction Typing Derivations . . . . . . . . . Typechecking . . . . . . . . . . . . Safety = Preservation + Progress . 6.4 Implementation . . . . . . . . . . . . 6.5 Summary . . . . . . . . . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

52 52 52 53 53 54 54 55 56

Simply Typed Lambda-Calculus 7.1 Syntax . . . . . . . . . . . . . . . . . 7.2 The Typing Relation . . . . . . . . . 7.3 Summary . . . . . . . . . . . . . . . . 7.4 Properties of Typing and Reduction Typechecking . . . . . . . . . . . . Typing and Substitution . . . . . . Type Soundness . . . . . . . . . . . 7.5 Implementation . . . . . . . . . . . . 7.6 Further Reading . . . . . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

58 58 59 61 62 62 64 64 65 66

8

9

Extensions 8.1 Base Types . . . . . . . . . . . 8.2 Unit type . . . . . . . . . . . . 8.3 Let bindings . . . . . . . . . . 8.4 Records and Tuples . . . . . . 8.5 Variants . . . . . . . . . . . . . 8.6 General recursion . . . . . . . 8.7 Lists . . . . . . . . . . . . . . . 8.8 Lazy records and let-bindings

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

67 67 67 68 68 72 72 73 75

References 76 9.1 Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

10 Exceptions 80 10.1 Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 10.2 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 11 Type Equivalence

81

12 Definitions 83 12.1 Type Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 12.2 Term Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 13 Subtyping 13.1 The Subtype Relation . . Variance . . . . . . . . Summary . . . . . . . . 13.2 Metatheory of Subtyping Algorithmic Subtyping Minimal Typing . . . . 13.3 Implementation . . . . . 13.4 Meets and Joins . . . . . 13.5 Primitive Subtyping . . 13.6 The Bottom Type . . . . 13.7 Other stuff . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

86 87 88 89 91 91 92 96 97 99 99 99

14 Imperative Objects 14.1 Objects . . . . . . . . . . . . 14.2 Object Generators . . . . . . 14.3 Subtyping . . . . . . . . . . 14.4 Basic classes . . . . . . . . . 14.5 Extending the Internal State 14.6 Classes with “Self” . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

100 100 102 103 104 105 106

. . . . . . . . . . .

15 Recursive Types 15.1 Examples . . . . . . . . . . . . . . . . . . . Lists . . . . . . . . . . . . . . . . . . . . . Hungry Functions . . . . . . . . . . . . . Recursive Values from Recursive Types Untyped Lambda-Calculus, Redux . . . Recursive Objects . . . . . . . . . . . . . 15.2 Equi-recursive Types . . . . . . . . . . . . ML Implementation . . . . . . . . . . . . 15.3 Iso-recursive Types . . . . . . . . . . . . . 15.4 Subtyping and Recursive Types . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

109 . 109 . 109 . 109 . 110 . 110 . 112 . 112 . 114 . 115 . 116

16 Case Study: Featherweight Java

117

17 Type Reconstruction 17.1 Substitution . . . . . . . . . . . . . . . . 17.2 Universal vs. Existential Type Variables 17.3 Constraint-Based Typing . . . . . . . . . 17.4 Unification . . . . . . . . . . . . . . . . . 17.5 Principal Typings . . . . . . . . . . . . . 17.6 Further Reading . . . . . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

18 Universal Types 18.1 Motivation . . . . . . . . . . . . . . . 18.2 Varieties of Polymorphism . . . . . . 18.3 Definitions . . . . . . . . . . . . . . . 18.4 Examples . . . . . . . . . . . . . . . . Warm-ups . . . . . . . . . . . . . . Polymorphic Lists . . . . . . . . . . Impredicative Encodings . . . . . . 18.5 Metatheory . . . . . . . . . . . . . . . Soundness . . . . . . . . . . . . . . Strong Normalization . . . . . . . . Erasure and Typeability . . . . . . Type Reconstruction . . . . . . . . 18.6 Implementation . . . . . . . . . . . . Nameless Representation of Types ML Code . . . . . . . . . . . . . . . 18.7 Further Reading . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

130 . 130 . 131 . 132 . 135 . 135 . 136 . 136 . 139 . 139 . 139 . 140 . 141 . 141 . 141 . 141 . 143

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

118 118 119 121 125 128 129

19 Existential Types 19.1 Motivation . . . . . . . . . . . . . . 19.2 Data Abstraction with Existentials Abstract Data Types . . . . . . . . Existential Objects . . . . . . . . . Objects vs. ADTs . . . . . . . . . 19.3 Encoding Existentials . . . . . . . . 19.4 Implementation . . . . . . . . . . . 19.5 Historical Notes . . . . . . . . . . .

. . . . . . . .

144 144 149 149 152 154 154 156 156

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

20 Bounded Quantification 20.1 Motivation . . . . . . . . . . . . . . . . 20.2 Definitions . . . . . . . . . . . . . . . . Kernel F