Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Nowa wersja
Poprzednia wersja
pl:dydaktyka:pp:haskell:lab-more-funcs [2018/05/16 22:16]
kkutt utworzono
pl:dydaktyka:pp:haskell:lab-more-funcs [2018/05/28 20:31]
kkutt > zamienione na ghci>
Linia 1: Linia 1:
-===== Lab: Więcej funkcji =====+====== Lab: Więcej funkcji ​======
  
 Tematyka: Tematyka:
Linia 17: Linia 17:
     * 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> ​
Linia 64: Linia 64:
 -- 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>ghcimyReverse ​"​Kocham Haskella"​
 "​alleksaH mahcoK"​ "​alleksaH mahcoK"​
-reverse' ​"​kobyla ma maly bok"+ghcimyReverse ​"​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 ''​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>ghciconajmniejn2 ​[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+ghciconajmniejn2 ​[4,​5,​2,​5,​4,​3,​1,​3,​4] 4
 []</​code>​ []</​code>​
pl/dydaktyka/pp/haskell/lab-more-funcs.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0