mirror of
https://github.com/idris-lang/Idris2.git
synced 2024-12-16 15:52:43 +03:00
35 lines
918 B
Idris
35 lines
918 B
Idris
|
data Nat = Z | S Nat
|
||
|
|
||
|
plus : Nat -> Nat -> Nat
|
||
|
plus Z y = y
|
||
|
plus (S k) y = S (plus k y)
|
||
|
|
||
|
data Vect : Nat -> Type -> Type where
|
||
|
Nil : Vect Z a
|
||
|
Cons : a -> Vect k a -> Vect (S k) a
|
||
|
|
||
|
foldl : (0 b : Nat -> Type) ->
|
||
|
({k : Nat} -> b k -> a -> b (S k)) ->
|
||
|
b Z ->
|
||
|
Vect n a -> b n
|
||
|
foldl b g z Nil = z
|
||
|
foldl b g z (Cons x xs) = foldl (\i => b (S i)) g (g z x) xs
|
||
|
|
||
|
reverse : Vect n a -> Vect n a
|
||
|
reverse
|
||
|
= foldl (\m => Vect m a)
|
||
|
(\rev => \x => Cons x rev) Nil
|
||
|
|
||
|
append : Vect n a -> Vect m a -> Vect (plus n m) a
|
||
|
append Nil ys = ys
|
||
|
append (Cons x xs) ys = Cons x (append xs ys)
|
||
|
|
||
|
vlength : (n : Nat) -> Vect n a -> Nat
|
||
|
vlength Z Nil = Z
|
||
|
vlength n@_ (Cons x xs) = n -- (vlength _ xs);
|
||
|
|
||
|
zipWith : (a -> b -> c) -> Vect n a -> Vect n b -> Vect n c
|
||
|
zipWith f Nil Nil = Nil
|
||
|
-- zipWith f (Cons x xs) Nil impossible
|
||
|
zipWith f (Cons x xs) (Cons y ys) = Cons (f x y) (zipWith f xs ys)
|