Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:pp:haskell:lab-io [2018/06/03 21:51] esimon [Pliki] |
pl:dydaktyka:pp:haskell:lab-io [2020/04/27 08:50] (aktualna) msl [Uwaga na return] |
| |
Zwróć uwagę na nagłówek funkcji main, która jest typu IO i zwraca () -- coś na wzór //void//. | Zwróć uwagę na nagłówek funkcji main, która jest typu IO i zwraca () -- coś na wzór //void//. |
IO to specjalna wbudowana monada (podobnie jak Maybe) | IO to specjalna wbudowana monada, co to naprawdę jest monada, dowiemy się w kolejnym odcinku, na dzisiaj wystarczy nam uznać, że monada to jakaś wartość opakowana w kontekst. Inne przykład opakowania (monady), który już znamy, to ''Maybe'', które opakowuje wartość w sposób umożliwiający wyrazić brak wartości. W przypadku ''IO'', opakowane są wszystkie wartości pochodzące spoza programu - innymi słowy wejście i wyjście. |
Funkcja main jest tak naprawdę //akcją IO//, czyli komponentem programu zintegrowanym ze //światem zewnętrznym//, który może potencjalnie mieć wpływ na zmianę stanu tego świata zewnętrznego. | Funkcja ''main'' jest tak naprawdę //akcją wejścia-wyjścia//, jedynym miejscem w programie, który ma bezpośredni kontakt ze światem zewnętrznym, mając dostęp do monady IO. Funkcja ''main'' może przekazywać tę monadę innym funkcjom lub sama wypakowywać wartości z monady i przekazywać je dalej. |
| |
Analogicznie funkcja wczytująca napis z klawiatury, będzie akcją zdefiniowaną jako: | Przykładem wypakowania wartości z monady IO jest funkcja wczytująca napis z klawiatury, zdefiniowana jako: |
| |
<code> | <code> |
</code> | </code> |
| |
Czyli, jest akcją typu IO i zwraca String. | Innymi słowy, jest to //akcja// typu IO i zwraca String. Akcjami będziemy dzisiaj nazywać funkcje operujące na monadach. |
===== Interakcja z użytkownikiem ===== | ===== Interakcja z użytkownikiem ===== |
Przykład najprostszej interakcji z użytkownikiem: | Przykład najprostszej interakcji z użytkownikiem: |
main = putStrLn "Hello, what's your name?" >> ( getLine >>= (\ name -> putStrLn $ "Hello " ++ name ++ " good to see you!")) | main = putStrLn "Hello, what's your name?" >> ( getLine >>= (\ name -> putStrLn $ "Hello " ++ name ++ " good to see you!")) |
</code> | </code> |
| |
| ''>>'' łączy akcje, gdzie wynik pierwszej akcji nie ma wpływu na drugą. ''>>='' natomiast przekazuje wynik jednej akcji do kolejnej. Oba te operatory umożliwiają łańcuchowanie akcji - notacja ''do'' sprawia, że kod wygląda czytelniej. |
| |
| |
| |
Polecenie return w bloku **do** nie kończy wcale wykonywania kodu i nie powoduje zwrócenia wartości na zewnątrz bloku. | Polecenie return w bloku **do** nie kończy wcale wykonywania kodu i nie powoduje zwrócenia wartości na zewnątrz bloku. |
Jest ono traktowane jak kolejna akcja, która w przypadku powyżej nie robi nic. | Jest ono traktowane jak kolejna akcja, która w przypadku powyżej nie robi nic. Co naprawdę znaczy ''return'' w haskellu, dowiemy się na następnych zajęciach. |
| |
===== Pliki ===== | ===== Pliki ===== |
| |
main = do | main = do |
| -- ''randomIO'' odwołuje się do świata zewnętrznego, używając go jako ziarna do generacji losowej liczby. |
num <- randomIO :: IO Int | num <- randomIO :: IO Int |
print num | print num |
</code> | </code> |
- Napisz program odwracający i wyświetlający napis, który wcześniej został podany przez użytkownika. Program powinien wczytywać i odwracać stringi do czasu, aż użytkownik poda pustą linię. | - Napisz program odwracający i wyświetlający napis, który wcześniej został podany przez użytkownika. Program powinien wczytywać i odwracać stringi do czasu, aż użytkownik poda pustą linię. |
| - Napisz program wczytujący plik i zapisujący jego zawartość w wersji CAPSLOCK |
| - Napisz program typu //spellchecker//, czytający plik tekstowy, znajdujący w nim słowa, które nie występują w ''/usr/share/dict/words''. Sprawdzanie nie powinno być case-sensitive. Znalezione //błędne// słowa powinny zostać zapisane w odrębnym pliku. |
| |