Type dispatch constructs are an important feature of many programming languages. Scheme
has predicates for testing the runtime type of a value. Java has a class cast expression
and a try statement for switching on an exception's class. Crucial to these mechanisms, in
typed languages, is type refinement: The static type system will use type dispatch to
refine types in successful branches. Considerable previous work has addressed type case
constructs for structural type systems without subtyping, but these do not extend to named
type systems with subtyping, as is common in object oriented languages. Previous work on
type dispatch in named type systems with subtyping has not addressed its implementation
formally.
This paper describes a number of type dispatch constructs that share a common theme: class
cast and class case constructs in object oriented languages, ML style exceptions,
hierarchical extensible sums, and multimethods. I describe a unifying mechanism, tagging,
that abstracts the operation of these constructs, and I formalise a small tagging
language. After discussing how to implement the tagging language, I present a typed
language without type dispatch primitives, and a give a formal translation from the
tagging language.