  Elixir is a dynamically-typed functional language running on the Erlang
Virtual Machine, designed for building scalable and maintainable applications.
Its characteristics have earned it a surging adoption by hundreds of industrial
actors and tens of thousands of developers. Static typing seems nowadays to be
the most important request coming from the Elixir community. We present a
gradual type system we plan to include in the Elixir compiler, outline its
characteristics and design principles, and show by some short examples how to
use it in practice. Developing a static type system suitable for Erlang's
family of languages has been an open research problem for almost two decades.
Our system transposes to this family of languages a polymorphic type system
with set-theoretic types and semantic subtyping. To do that, we had to improve
and extend both semantic subtyping and the typing techniques thereof, to
account for several characteristics of these languages -- and of Elixir in
particular -- such as the arity of functions, the use of guards, a uniform
treatment of records and dictionaries, the need for a new sound gradual typing
discipline that does not rely on the insertion at compile time of specific
run-time type-tests but, rather, takes into account both the type tests
performed by the virtual machine and those explicitly added by the programmer.
The system presented here is "gradually" being implemented and integrated in
Elixir, but a prototype implementation is already available. The aim of this
work is to serve as a longstanding reference that will be used to introduce
types to Elixir programmers, as well as to hint at some future directions and
possible evolutions of the Elixir language.
