disjoint unions (quick review)

15
Disjoint Unions (quick review) • Pascal: variant record • C/C++: union • ML: union type • Ada: discriminated record

Upload: porter-rhodes

Post on 31-Dec-2015

17 views

Category:

Documents


0 download

DESCRIPTION

Disjoint Unions (quick review). Pascal: variant record C/C++: union ML: union type Ada: discriminated record. What is a disjoint union?. “Another kind of composite value is the disjoint union , whereby a value is chosen from one of several (usually different) sets.” David Watt - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Disjoint Unions (quick review)

Disjoint Unions(quick review)

• Pascal: variant record

• C/C++: union

• ML: union type

• Ada: discriminated record

Page 2: Disjoint Unions (quick review)

What is a disjoint union?

• “Another kind of composite value is the disjoint union, whereby a value is chosen from one of several (usually different) sets.”

David Watt

Programming Language Design Concepts page 27

Page 3: Disjoint Unions (quick review)

S+T

Values are tagged to indicate which set they are from:

S+T = { left(x) | x in S } { right(y) | y in T }

Cardinality? #(S+T) = #S + #T

Page 4: Disjoint Unions (quick review)

MLdatatype number = Exact of int | Inexact of real;

datatype person = King

| Peer of string*string*int

| Knight of string

| Peasant of string;

Values: King, Peer(“Earl”, “Carlisle”, 7),

Knight(“Gawain”), Peasant(“Jack Cade”)

Paulson, ML for the Working Programmer

pages 124-125

Page 5: Disjoint Unions (quick review)

OO disjoint unions(new material)

• The main purpose of a disjoint union is to bring together values from different sets in a way that you can determine from which set a given value is drawn.

• This type of structure is used very commonly in OO programming.

• Polymorphism feeds off of this idea: implicit selection based on type.

Page 6: Disjoint Unions (quick review)

OO disjoint union example

Disjoint union

Page 7: Disjoint Unions (quick review)

Recursive types

• A type defined in terms of itself• Examples: lists, strings, trees, …• If R is a recursive type, #(R) is infinite.• Members of a recursive type are often

finite, tough infinite members are possible (the list of all primes).

• How? They are implicitly represented (think of function vs. array representation of mappings): e.g. lazy lists.

Page 8: Disjoint Unions (quick review)

Recursive type membership• Consider the list type:datatype ’a List = Nil

| Cons of ’a * ’a List;

• What are the members of this type?List(0) = NilList(1) = List(0) U {Cons(x,y)| y in List(0)}…List(k) = List(k-1) U {Cons(x,y)| y in List(k-1)}

List = Un=0…∞ List(n)

Page 9: Disjoint Unions (quick review)

C++ & pointer types

• Languages like C++ do not directly support recursive types, but rather require the use of an indirection mechanism, the pointer.

• This has to do with the semantics of assignment. If v is a recursive structure, what are reasonable semantics for w=v?– copy semantics – expensive – reference semantics – sharing

• If language does not permit selective updating of a structure (as in a pure functional language) the semantics are indistinguishable).

Page 10: Disjoint Unions (quick review)

Type equivalence

Type equivalence addresses the question of when two types are considered equivalent.

– Structural equivalence• two types are equivalent if and only if they have

the same set of values

– Name equivalence• two types are equivalent if and only if they are

defined in the same place

Page 11: Disjoint Unions (quick review)

Structural equivalence

• Types S and T are equivalent iff– S and T are both primitive and S and T are identical– S=AxB and T=CxD are both cartesian products and A

and C are equivalent and B and D are equivalent– S=AB and T=CD are both mappings and A and C

are equivalent and B and D are equivalent– S=A+B and T=C+D are both disjoint unions and A

and C are equivalent and B and D are equivalent

• Otherwise, S and T are not equivalent.

Page 12: Disjoint Unions (quick review)

Name equivalence

• Strictly, types are unique – each new type definition occurs in a different place, and so results in a new distinct type.

• Pascal technically uses name equivalence, but in practice the rules are relaxed:– For example, suppose we wanted to define a file type

to permit two programs to communicate via a file. Since the file type is defined in two different places (in two different programs) their files types are considered different (and hence incompatible).

Page 13: Disjoint Unions (quick review)

Name vs. Structural equivalence

• Name equivalence forces each distinct type to be defined in one and only one place. This is sometimes inconvenient, but it helps to make the program more maintainable. (If the same type is defined in several places, and subsequently it has to be changed, the change must be made consistently in several places.)

• Structural equivalence allows confusion between types that are only coincidentally similar.

Watt, page 42

Page 14: Disjoint Unions (quick review)

Type Completeness Principle

“No operation should be arbitrarily restricted in the types of its operands.”

Watt, page 43Types whose values are unrestricted in their usage are termed “first-class”, whereas those that are restricted are termed “second-class”.In Pascal procedures can be passed as arguments to other procedures, but cannot, for example, be part of a composite value. Pascal procedures are therefore second class.A language like ML imposes no such arbitrary type distinctions. All types are first-class.