ByRecursion.agda 859 B

123456789101112131415161718192021222324252627282930313233343536
  1. -- When defining types by recursion it is sometimes difficult to infer implicit
  2. -- arguments. This module illustrates the problem and shows how to get around
  3. -- it for the example of vectors of a given length.
  4. module Introduction.Data.ByRecursion where
  5. data Nat : Set where
  6. zero : Nat
  7. suc : Nat -> Nat
  8. data Nil : Set where
  9. nil' : Nil
  10. data Cons (A As : Set) : Set where
  11. _::'_ : A -> As -> Cons A As
  12. mutual
  13. Vec' : Set -> Nat -> Set
  14. Vec' A zero = Nil
  15. Vec' A (suc n) = Cons A (Vec A n)
  16. data Vec (A : Set)(n : Nat) : Set where
  17. vec : Vec' A n -> Vec A n
  18. nil : {A : Set} -> Vec A zero
  19. nil = vec nil'
  20. _::_ : {A : Set}{n : Nat} -> A -> Vec A n -> Vec A (suc n)
  21. x :: xs = vec (x ::' xs)
  22. map : {n : Nat}{A B : Set} -> (A -> B) -> Vec A n -> Vec B n
  23. map {zero} f (vec nil') = nil
  24. map {suc n} f (vec (x ::' xs)) = f x :: map f xs