Vec.agda 989 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. module Lib.Vec where
  2. open import Lib.Prelude
  3. open import Lib.Nat
  4. open import Lib.Fin
  5. infixr 40 _::_ _++_
  6. data Vec (A : Set) : Nat -> Set where
  7. [] : Vec A 0
  8. _::_ : forall {n} -> A -> Vec A n -> Vec A (suc n)
  9. _++_ : {A : Set}{n m : Nat} -> Vec A n -> Vec A m -> Vec A (n + m)
  10. [] ++ ys = ys
  11. (x :: xs) ++ ys = x :: xs ++ ys
  12. infix 10 _!_
  13. _!_ : forall {A n} -> Vec A n -> Fin n -> A
  14. [] ! ()
  15. x :: xs ! zero = x
  16. x :: xs ! suc i = xs ! i
  17. tabulate : forall {A n} -> (Fin n -> A) -> Vec A n
  18. tabulate {n = zero} f = []
  19. tabulate {n = suc n} f = f zero :: tabulate (f ∘ suc)
  20. vec : forall {A n} -> A -> Vec A n
  21. vec x = tabulate (\_ -> x)
  22. infixl 30 _<*>_
  23. _<*>_ : forall {A B n} -> Vec (A -> B) n -> Vec A n -> Vec B n
  24. [] <*> [] = []
  25. f :: fs <*> x :: xs = f x :: (fs <*> xs)
  26. map : forall {A B n} -> (A -> B) -> Vec A n -> Vec B n
  27. map f xs = vec f <*> xs
  28. zip : forall {A B C n} -> (A -> B -> C) -> Vec A n -> Vec B n -> Vec C n
  29. zip f xs ys = vec f <*> xs <*> ys