  The pattern-match safety problem is to verify that a given functional program
will never crash due to non-exhaustive patterns in its function definitions. We
present a refinement type system that can be used to solve this problem. The
system extends ML-style type systems with algebraic datatypes by a limited form
of structural subtyping and environment-level intersection. We describe a fully
automatic, sound and complete type inference procedure for this system which,
under reasonable assumptions, is worst-case linear-time in the program size.
Compositionality is essential to obtaining this complexity guarantee. A
prototype implementation for Haskell is able to analyse a selection of packages
from the Hackage database in a few hundred milliseconds.
