05. Przykład i zadania ------------------------------------------------------------ Przykład 01 ------------------------------------------------------------ main :: IO () main = print (skl 4) skl :: Integer -> Integer skl x = x * (x +1) `div` 2 ------------------------------------------------------------ Przykład 02 ------------------------------------------------------------ main :: IO () main = do print (skl 4) print (iter (2, skl) 4) skl :: Integer -> Integer skl x = x * (x +1) `div` 2 iter :: (Integer, Integer -> Integer) -> (Integer -> Integer) iter (0, f) x = x iter (n, f) x = f (iter (n - 1, f) x) ------------------------------------------------------------ Zadania podstawowe ------------------------------------------------------------ Zad.01 Napisz kod rozwiązujący równanie kwadratowe. W wersji I wykorzystaj konstrukcję if..else. W wersji II skorzystaj z dozorów/strażników (konstrukcja typu "case"). Zad.02 Zaimplementuj silnię. Zad.03 Napisz funkcję wyznaczającą kolejne wyrazy ciągu Fibonacciego x_n = x_{n-1} + x_{n-2} ------------------------------------------------------------ Interludium - obliczanie "leniwe" ------------------------------------------------------------ (1) Lista nieskończona: takeWhile (<50) (map kw [0..]) where kw x = x*x // w GHCI: // let kw x = x*x // takeWhile (<50) (map kw [0..]) (2) Haskell tylko raz obliczy wyrażenie snd(...) - optymalizacja kw (snd ([1..],5)) ------------------------------------------------------------ Interludium - rekurencyjne definiowanie typów ------------------------------------------------------------ main :: IO() main = do print (kw (Nast(Nast(Nast Zero)))) print ( razyNat (Nast(Nast(Nast Zero)),Nast(Nast(Nast Zero))) ) data Nat = Zero | Nast Nat nat2int :: Nat -> Integer nat2int Zero = 0 nat2int (Nast x) = 1 + nat2int x instance Show Nat where show x = show (nat2int x) dodNat :: (Nat, Nat) -> Nat dodNat (x, Zero) = x dodNat (x, Nast y) = Nast (dodNat (x, y)) razyNat :: (Nat, Nat) -> Nat razyNat (x, Zero) = Zero razyNat (x, Nast y) = dodNat(x, razyNat (x, y)) kw :: Nat -> Integer kw Zero = 0 kw (Nast x) = nat2int(Nast x) * nat2int(Nast x) ------------------------------------------------------------ Zadania dodatkowe [B.A.Tate, "7 języków w 7 tygodni"] ------------------------------------------------------------ Zad.04 Napisz funkcję, która pobiera listę i zwraca tę samą listę z elementami w odwróconej kolejności. (Nie korzystając z gotowej funkcji reverse!) Zad.05 Napisz funkcję, która generuje dwuelementowe "krotki" z wszystkimi możliwymi kombinacjami dwóch kolorów ze zbioru {czarny, biały, niebieski, żółty, czerwony}. Wyeliminuj wyniki typu (czerwony,czerwony) oraz powtórzenia typu (czerwony, zielony) - (zielony, czerwony). Zad.06 Skorzystaj z mechanizmu składania list w celu utworzenia tabliczki mnożenia. Tabela powinna być listą złożoną z trójelementowych "krotek". Pierwsze dwa elementy to liczby z zakresu 1..12, a trzeci to ich iloczyn.