{-
% cv. 9 ; na 19.4.2017 (St) ; Jan Hric
% v. 1.0

% Obsah: cv9:
Haskell

; prejmenovat na *.hs 

-}

-- vzor
suma1 :: [Integer] -> Integer
suma1 [] = 0
suma1 (x:xs) = x + suma1 xs

length1 :: [a] -> Integer
length1 [] = 0
length1 (x:xs) = 1 + length1 xs

{-
Naprogramujte:

1. Klouzavy prumer ze 3, pomoci div/2
klPrum :: [Int] -> [Int]

2. Klouzavy prumer ze n, pomoci div/2
klPrumN :: Int -> [Int] -> [Int]

3. nKratF: opakovani funkce n krat
nKratF :: (a -> a) -> a -> a

4. rychle umocnovani : expR x n = x^n
expR :: a -> Integer -> a   -- nepresne

5. rychle umocnovani s modulo : expR x n m = (x^n mod m)
expMod :: a -> Integer -> Integer -> a   -- nepresne

6. Fibonacciho cisla, pomocna fce z dvojic na dvojice

7. lookup1: vyhledavani klice, kdyz tam je 
lookup1 :: a -> [(a,b)] -> b

8. kartezsky soucin

9. test komutativity


-----------------------------------------------
Z minulych let:

- klouzavy prumer ze 3
  - klouzavy prumer z n
- mergesort, sude, liche, merge
- testKomut
  - kartezsky soucin
- filter
- tridy ekv.
- lookup, zjednoduseny
- automaty (2x), reprezentace DKA vs. NKA, krok
- (rychle umocnovani)
- (FFT)

-----------------------------------------------
% Obsah: cv8: Scheme

1. map/2
Transformuje prvky xs 1:1 pomoci funkce f/1. Vystup je stejne dlouhy.
(define (map f xs) ...)

2. filter/2
Na vystupu jsou ty prvky xs, pro ktere plati podminka podm/1
(define (filter podm xs) ... )

2a filterWithLast/2 ; spis pro Haskell
Jako filter/2, ale na vystupu je vzdy i posledni prvek.
(define (filterWithLast podm xs) ... )
; Jak testovat, zda je vstup jednoprvkovy (pomoci null? ) ?

;(filter, map, reduce)

3. rozdelFiltrem/2 pomoci filter/2
  - vstup jako filter/2, ale vraci dva seznamy v dvojici: v prvnim plati 
	pro prvky podminka podm/1, ve druhem neplati
(define (rozdelFiltrem podm xs) 
   ... )
; potrebujeme negovanou podminku
  - abstrakce: zdvih funkce  

4. split/3 pomoci rozdelFiltrem/2
Split/3 rozdeli xs na prvky mensi (podle cmp/2) nez pivot a prvky ostatni
(define (split cmp pivot xs) ...)
  - split ma jiny interface, chceme prevest funkcionalni parametr cmp/2 ze split na 
	vhodny funkcionalni parametr podm/1 pro rozdelFiltrem/2

4.1 Mate sort/2 s funkcionalnim parametrem cmp/2 pro relaci </2, ktery tridi vzestupne.
(define (sort cmp xs) ....)
  - Napiste funkci sortOp/2 (nebo volani) pomoci sort/2, ktera bude se stejnymi 
	parametry tridit sestupne.
(define (sortOp cmp xs) 
  (sort ?? xs) )
- Navrhnete vhodnou abstrakci, ktera dovoli transformovat funkci cmp/2 v sortOp/2 na vhodnou
	funkci cmp1/2 v sort/2

5. Hornerovo schema:
5a  - h.s./2 vypoctem: vstup jsou koeficienty a hodnota
5b  - h.s./1->/1 generovani funkce: vstup jsou koeficienty, vraci funkci pro hodnotu
5c  - h.s./2 generovani vyrazu: vsttup jsou koeficienty a identifikator promenne 'x

6. komplexni cisla:
6a: mkPolar/2
6b: ...

- eval, apply


%%%%%%%%%%%%%%%%%%%%
% souhrn: co jste si vyzkouseli:
% - Scheme
% - strukturalni rekurzi na seznamech
% - lambda funkce
%   - pretvareni lambda funkci 

%%%%%%%%%%%%%%%%%%%%%%%%%%%
% runtime
-}

