Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:pp:haskell:lab-more-funcs [2018/05/22 10:31] kkutt [Zadania] |
pl:dydaktyka:pp:haskell:lab-more-funcs [2018/05/28 20:31] kkutt > zamienione na ghci> |
* Skoro po przyjęciu pierwszego argumentu zwracana jest funkcja i do niej dopiero jest aplikowany kolejny argument, poprawnym wyrażeniem będzie: <code haskell>dodaj1 :: Int -> Int | * Skoro po przyjęciu pierwszego argumentu zwracana jest funkcja i do niej dopiero jest aplikowany kolejny argument, poprawnym wyrażeniem będzie: <code haskell>dodaj1 :: Int -> Int |
dodaj1 = sum2c 1</code> dodaj1 jest funkcją zwróconą przez ''%%sum2c 1%%'', czyli funkcją dodającą 1 do swojego argumentu\\ //Takie częściowe określenie argumentów funkcji nazywa się [[wp>Partial_application]]// | dodaj1 = sum2c 1</code> dodaj1 jest funkcją zwróconą przez ''%%sum2c 1%%'', czyli funkcją dodającą 1 do swojego argumentu\\ //Takie częściowe określenie argumentów funkcji nazywa się [[wp>Partial_application]]// |
* Idźmy dalej: pamiętasz funkcję ''%%map%%'', którą implementowaliśmy na pierwszych zajęciach? Jaki jest jej typ? <code haskell>Prelude> :t map | * Idźmy dalej: pamiętasz funkcję ''%%map%%'', którą implementowaliśmy na pierwszych zajęciach? Jaki jest jej typ? <code haskell>ghci> :t map |
map :: (a -> b) -> [a] -> [b]</code> dodajmy do tego brakujący nawias, aby nie było wątpliwości co tutaj się dzieje: <code haskell>map :: (a -> b) -> ([a] -> [b])</code> czyli: map przyjmuje jako swój argument funkcję o typie ''%%a -> b%%'' i zwraca funkcję o typie ''%%[a] -> [b]%%'', czyli jak najbardziej możemy wywołać: <code haskell>map dodaj1 [1..10]</code> nie musisz nawet tworzyć osobnej funkcji ''dodaj1''! map może przyjąć to co jest zwrócone przez ''%%sum2c 1%%'': <code haskell>map (sum2c 1) [1..10]</code> możesz nawet pójść o krok dalej i stworzyć funkcję, która dodaje 1 do wszystkich elementów listy! <code haskell>dodaj1doListy :: [Int] -> [Int] | map :: (a -> b) -> [a] -> [b]</code> dodajmy do tego brakujący nawias, aby nie było wątpliwości co tutaj się dzieje: <code haskell>map :: (a -> b) -> ([a] -> [b])</code> czyli: map przyjmuje jako swój argument funkcję o typie ''%%a -> b%%'' i zwraca funkcję o typie ''%%[a] -> [b]%%'', czyli jak najbardziej możemy wywołać: <code haskell>map dodaj1 [1..10]</code> nie musisz nawet tworzyć osobnej funkcji ''dodaj1''! map może przyjąć to co jest zwrócone przez ''%%sum2c 1%%'': <code haskell>map (sum2c 1) [1..10]</code> możesz nawet pójść o krok dalej i stworzyć funkcję, która dodaje 1 do wszystkich elementów listy! <code haskell>dodaj1doListy :: [Int] -> [Int] |
dodaj1doListy = map dodaj1</code> | dodaj1doListy = map dodaj1</code> |
-- funkcja przyjmuje operator, który jest typu (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</code> | -- oraz lewą część operatora i zwraca funkcję, która przyjmuje prawą część operatora i zwraca wynik</code> |
* **Przykład użycia:** <code haskell>> dodaj3 = generatorOperator (+) 3 | * **Przykład użycia:** <code haskell>ghci> dodaj3 = generatorOperator (+) 3 |
> dodaj3 2 | ghci> dodaj3 2 |
5 | 5 |
> podziel100 = generatorOperator (/) 100 | ghci> podziel100 = generatorOperator (/) 100 |
> podziel100 8 | ghci> podziel100 8 |
12.5</code> | 12.5</code> |
- Wykorzystując ''fold'' zdefiniuj funkcję odwracającą String. | - Wykorzystując ''fold'' zdefiniuj funkcję odwracającą String. |
* **Nagłówek funkcji:** <code haskell>reverse' :: String -> String</code> | * **Nagłówek funkcji:** <code haskell>myReverse :: String -> String</code> |
* **Przykład użycia:** <code haskell>> reverse' "Kocham Haskella" | * **Przykład użycia:** <code haskell>ghci> myReverse "Kocham Haskella" |
"alleksaH mahcoK" | "alleksaH mahcoK" |
> reverse' "kobyla ma maly bok" | ghci> myReverse "kobyla ma maly bok" |
"kob ylam am alybok"</code> | "kob ylam am alybok"</code> |
- 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. | - 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:** <code haskell>policzISumuj :: (Int -> Int) -> Int -> Int -> Int</code> | * **Nagłówek funkcji:** <code haskell>policzISumuj :: (Int -> Int) -> Int -> Int -> Int</code> |
* **Przykład użycia:** <code haskell>>policzISumuj (^2) 1 10 | * **Przykład użycia:** <code haskell>ghci>policzISumuj (^2) 1 10 |
385 | 385 |
> policzISumuj (\x -> 42) 123 127 | ghci> policzISumuj (\x -> 42) 123 127 |
210</code> | 210</code> |
- Wykorzystując funkcję ''filter'' oraz lambdy, stwórz funkcję wybierającą z zadanej listy liczby pierwsze. | - Wykorzystując funkcję ''filter'' oraz lambdy, stwórz funkcję wybierającą z zadanej listy liczby pierwsze. |
* **Nagłówek funkcji:** <code haskell>pierwsze :: [Int] -> [Int]</code> | * **Nagłówek funkcji:** <code haskell>pierwsze :: [Int] -> [Int]</code> |
* **Przykład użycia:** <code haskell>> pierwsze [100..110] | * **Przykład użycia:** <code haskell>ghci> pierwsze [100..110] |
[101,103,107,109] | [101,103,107,109] |
> take 15 $ pierwsze [1..] | ghci> take 15 $ pierwsze [1..] |
[1,2,3,5,7,11,13,17,19,23,29,31,37,41,43]</code> | [2,3,5,7,11,13,17,19,23,29,31,37,41,43]</code> |
- 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 ''[[http://hackage.haskell.org/package/base-4.11.1.0/docs/Data-List.html#v:nub|nub]]''). Dla przypomnienia: | - 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 ''[[http://hackage.haskell.org/package/base-4.11.1.0/docs/Data-List.html#v:nub|nub]]''). Dla przypomnienia: |
* **Nagłówek funkcji:** <code haskell>conajmniejn' :: [Int] -> Int -> [Int]</code> | * **Nagłówek funkcji:** <code haskell>conajmniejn2 :: [Int] -> Int -> [Int]</code> |
* **Przykład użycia:** <code haskell>> conajmniejn' [4,5,2,5,4,3,1,3,4] 2 | * **Przykład użycia:** <code haskell>ghci> conajmniejn2 [4,5,2,5,4,3,1,3,4] 2 |
[5,3,4] | [5,3,4] |
> conajmniejn' [4,5,2,5,4,3,1,3,4] 4 | ghci> conajmniejn2 [4,5,2,5,4,3,1,3,4] 4 |
[]</code> | []</code> |