1. Dla wektorĂłw napisz:
 
a) my_vect_map : (a -> b) -> Vect n a -> Vect n b
b) insert, ktĂłry wsortowuje element x do posortowanej listy

insert : Ord el => (x : el) -> (xsSorted : Vect k el) -> Vect (S k) el

c) insertion sort, używając insert z poprzedniego podpunktu

insSort : Ord el => Vect n el -> Vect n el 

pamiętaj o import Data.Vect

2. Załóżmy, że typ macierzy nxm (n wierszy m kolumn) o wartościach w typie el reprezentowany jest przez Vect n (Vect m el). 

Używając:

create_empties : {n : Nat} -> Vect n (Vect 0 el)
create_empties {n = Z} = []
create_empties {n = (S k)} = [] :: create_empties


Napisz funkcje: 

a) transpose_mat : {n : Nat} -> Vect m (Vect n el) -> Vect n (Vect m el)
zamieniającą macierz 

1 2 3
4 5 6

na

1 4
2 5
3 6

b) addMatrix : Num el => Vect n (Vect m el) -> Vect n (Vect m el) -> Vect n (Vect m el)

c) multMatrix : Num el => {p: Nat} -> Vect m (Vect n el) -> Vect n (Vect p el) -> Vect m (Vect p el)

WskazĂłwka do c) zacznij od transpose_mat prawej macierzy 

3. Obejrzyj typ Fin i funkcje integerToFin i index
 
(:module Data.Vect, :doc Fin, :t integerToFin, :t index)

sprawdź wartości:

integerToFin 0 4
integerToFin 1 4
integerToFin 2 4
integerToFin 3 4
integerToFin 4 4

Napisz funkcje:

a) tryIndex : {n: _} -> Integer -> Vect n a -> Maybe a
b) vectTake - odpowiednik take dla list, biorący pod uwagę długości wektorów
c) sumEntriesAt : Num a => {n: _} -> (pos : Integer) -> Vect n a -> Vect n a -> Maybe a

sumująca wartości z dwóch wektorów pod indeksami pos

4. Obejrzyj plik Printf.idr i rozszerz o formaty dla Char i Double

5. Zdefiniuj funkcję TupleVect : Nat -> Type -> Type,
budującą typ wektorów o danej długości, używając zagnieżdżonych krotek: 

(TupleVect 0 ty) to ma być typ  ()
(TupleVect 1 ty) to ma być typ  (ty, ())
(TupleVect 2 ty) to ma byc typ  (ty, (ty, ()))
....

Czyli zdefiniuj funkcję obliczającą typy
      TupleVect: Nat -> Type -> Type
, tak Ĺźeby:

test : TupleVect 4 Nat
test = (1,2,3,4,())

Napisz appendTV dla takich wektorĂłw.