12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- -- This module introduces parameterised datatypes.
- module Introduction.Data.Parameterised where
- -- First some of our old friends.
- data Nat : Set where
- zero : Nat
- suc : Nat -> Nat
- data Bool : Set where
- false : Bool
- true : Bool
- -- A datatype can be parameterised over a telescope, (A : Set) in the case of
- -- lists. The parameters are bound in the types of the constructors.
- data List (A : Set) : Set where
- nil : List A
- cons : A -> List A -> List A
- -- When using the constructors the parameters to the datatype becomes implicit
- -- arguments. In this case, the types of the constructors are :
- -- nil : {A : Set} -> List A
- -- cons : {A : Set} -> A -> List A -> List A
- -- So, we can write
- nilNat = nil {Nat} -- the type of this will be List Nat
- -- When pattern matching on elements of a parameterised datatype you cannot
- -- refer to the parameters--it wouldn't make sense to pattern match on the
- -- element type of the list. So you can say
- null : {A : Set} -> List A -> Bool
- null nil = true
- null (cons _ _) = false
- -- but not
- -- null (nil {A}) = true
- -- null (cons {A} _ _) = false
|