2 KiB
Types
The Ava Type System
Ava is based on a static type system with support for higher-kinded types. Ava does not support inheritence. Ava does support sum types (Enumerations) and does support type classes.
The Nothing Type
The special type, Nothing
, cannot be instantiated. It can be used to describe
cases that cannot be expressed. For example, Either[Nothing, String]
cannot
ever be a Left
. Nothing
can be used to satisfy any type requirement. For
example, Either[Nothing, String]
satisfies Either[Int32, String]
.
Type Definitions
Types may directly, at the top level, be defined in terms of some type constructor:
given A, B
type TupleList := List[(A, B)]
Or in general terms:
type <type constructor> := <type definition>
Type Constructors
Type constructors essentially allow for types to be defined in terms of some set of type inputs. Consider the prior example:
given A, B
type TupleList := List[(A, B)]
The TupleList
type requires two type arguments, A
and B
, to be constructed
as a concrete type. For example, TupleList[String, Int32]
is a concrete type.
Higher Kinded Types
Type constructors in Ava may be higher order (e.g. not order 1) functions:
given A
type List is ???
given A, B
fn map_list: (List[A], (A) => B) => List[B]
given F[*]
type class Functor is
given A, B
fn map: (F[A])((A) => B) => F<B>
instance Functor[List] is
given A, B
fn map: (List[A])((A) => B) => [B] :=
(list)(f) => map_list (list, f)
In this example, Functor[F[*]]
is a type constructor which accepts a single
type argument. That type argument is a type constructor that accepts a single
concrete (order 0) type argument.