Spis treści

Lab: Więcej funkcji

Tematyka:

Wprowadzenie

Funkcje wyższego rzędu

Składanie funkcji

Jeszcze trochę o funkcjach: listy, lambdy, $

Zadania

  1. Dane jest wyrażenie
    [f x | x <- lista, p x]

    Zdefiniuj własną funkcję wykorzystującą wybrane z funkcji: map, fold, filter, aby otrzymać dokładnie taki sam efekt. Aby to przetestować możesz skorzystać z poniższego kodu – funkcje mojeLiczby i mojeLiczby' powinny zwracać w efekcie dokładnie tę samą listę!

    mojeLiczby = [f x | x <- lista, p x]
                 where f = \a -> 2 * a          -- f mnoży liczbę razy 2
                       lista = [1..10]          -- lista początkowa
                       p = \b -> b `mod` 2 == 0 -- p wybiera liczby parzyste
     
    mojeLiczby' = -- TUTAJ WPISZ SWOJĄ FUNKCJĘ!
                 where f = \a -> 2 * a
                       lista = [1..10]
                       p = \b -> b `mod` 2 == 0
  2. Zdefiniuj funkcję anonimową, która przyjmuje jako argument operator oraz liczbę i zwraca funkcję wykonującą daną operację matematyczną. Przypisz tę funkcję do nazwy generatorOperator.
    • Nagłówek funkcji:
      generatorOperator :: (lewa -> prawa -> wynik) -> lewa -> (prawa -> wynik)
      -- funkcja przyjmuje operator, który jest typu (lewa -> prawa -> wynik)
      -- oraz lewą część operatora i zwraca funkcję, która przyjmuje prawą część operatora i zwraca wynik
    • Przykład użycia:
      ghci> dodaj3 = generatorOperator (+) 3
      ghci> dodaj3 2
      5
      ghci> podziel100 = generatorOperator (/) 100
      ghci> podziel100 8
      12.5
  3. Wykorzystując fold zdefiniuj funkcję odwracającą String.
    • Nagłówek funkcji:
      myReverse :: String -> String
    • Przykład użycia:
      ghci> myReverse "Kocham Haskella"
      "alleksaH mahcoK"
      ghci> myReverse "kobyla ma maly bok"
      "kob ylam am alybok"
  4. Napisz funkcję policzISumuj, która przyjmuje trzy argumenty: funkcję, którą ma zaaplikować do każdego z elementów listy oraz pierwszy i ostatni element zakresu dla którego ma zostać zastosowana. W wyniku funkcja zwraca sumę wyników zaaplikowania funkcji do każdego z elementów.
    • Nagłówek funkcji:
      policzISumuj :: (Int -> Int) -> Int -> Int -> Int
    • Przykład użycia:
      ghci>policzISumuj (^2) 1 10
      385
      ghci> policzISumuj (\x -> 42) 123 127
      210
  5. Wykorzystując funkcję filter oraz lambdy, stwórz funkcję wybierającą z zadanej listy liczby pierwsze.
    • Nagłówek funkcji:
      pierwsze :: [Int] -> [Int]
    • Przykład użycia:
      ghci> pierwsze [100..110]
      [101,103,107,109]
      ghci> take 15 $ pierwsze [1..]
      [2,3,5,7,11,13,17,19,23,29,31,37,41,43]
  6. Korzystając ze swojej aktualnej wiedzy napisz jeszcze raz funkcję conajmniejn z poprzedniego laboratorium, ale tym razem jako jedną funkcję bez wykorzystania funkcji pomocniczych (dodatkowe utrudnienie dla zainteresowanych: zrób to bez korzystania z funkcji nub). Dla przypomnienia:
    • Nagłówek funkcji:
      conajmniejn2 :: [Int] -> Int -> [Int]
    • Przykład użycia:
      ghci> conajmniejn2 [4,5,2,5,4,3,1,3,4] 2
      [5,3,4]
      ghci> conajmniejn2 [4,5,2,5,4,3,1,3,4] 4
      []