------------------------------------------------------------------------------ -- Dependently typed functional languages - 2011-01 -- Some non-dependent types used in functional languages ------------------------------------------------------------------------------ -- References: -- -- Pierce, Benjamin C. (2002). Types and Programming Languages. MIT -- Press. -- Wikipedia article on algebraic data types. ------------------------------------------------------------------------------ -- To process an Agda file use C-c C-l. -- To find out how to write a given character, position the cursor over -- the character and press C-u C-x =. -- Common options {-# OPTIONS --double-check #-} {-# OPTIONS --exact-split #-} {-# OPTIONS --guardedness #-} {-# OPTIONS --no-sized-types #-} {-# OPTIONS --warning=all #-} {-# OPTIONS --warning=error #-} -- Other options {-# OPTIONS --no-universe-polymorphism #-} {-# OPTIONS --safe #-} {-# OPTIONS --without-K #-} module Lecture.NonDependentTypes where ------------------------------------------------------------------------------ infixr 6 _,_ infixr 5 _×_ infixr 4 _+_ -- Datatypes are introduced by a `data` declaration, giving the name -- and type of the datatype as well as the data constructors and their -- types. -- What is in most programming languages called `Type` is in Agda for -- historic reasons called `Set`. -- The empty (bottom) type: It is the type that has no inhabitants. data ⊥ : Set where -- To type ⊥ we type \bot. -- The unit (top) type: It is the type that allows only one value. data ⊤ : Set where -- To type ⊤ we type \top. tt : ⊤ -- (Parameterized) polymorphic type: It is a type that takes another -- type as its parameter. -- Product type: The product of two types is the type inhabited by -- pairs of terms whose first component is term of the first type and -- whose second component is an term of the second type. data _×_ (A B : Set) : Set where _,_ : A → B → A × B -- Tuple type: n-ary product type. -- Record type: A tuple type where each type has an label by which it -- can be accessed. See: -- https://agda.readthedocs.io/en/latest/language/record-types.html. record R (A B C : Set) : Set where field f₁ : A f₂ : B f₃ : C -- Sum type (disjoint union): A tagged union of types. data _+_ (A B : Set) : Set where inj₁ : A → A + B inj₂ : B → A + B -- Enumerated type: Generalized binary sums where the only type used -- is the unit type. data WeekDay : Set where monday : WeekDay tuesday : WeekDay wednesday : WeekDay thursday : WeekDay friday : WeekDay -- Function types: If `A B : Set` then `A → B` is the type of -- functions of `A` to `B`. -- Algebraic data types: Sum of product types. data Maybe (A : Set) : Set where just : A → Maybe A nothing : Maybe A data Either (A B : Set) : Set where left : A → Either A B right : B → Either A B -- Recursive type: It is a type that is defined in terms of itself. data ℕ : Set where zero : ℕ succ : ℕ → ℕ infixr 5 _∷_ data List (A : Set) : Set where [] : List A _∷_ : A → List A → List A data Tree (A : Set) : Set where empty : Tree A leaf : A → Tree A node : Tree A → Tree A → Tree A