JPP1920
Haskell
Haskell
Haskell
Haskell
Lab 1a (24.02)
Lab 1a (24.02)
Lab 1b (28.02)
Lab 1b (28.02)
Lab 2a (02.03)
Lab 2a (02.03)
Lab 2b (06.03)
Lab 2b (06.03)
- Na początku ćwiczymy razem leniwość
- W ramach ćwiczenia leniwości można rozwiązać zadanie Functional streams z codewars.com
- Ćwiczymy funkcję interact :: (String -> String) -> IO ()
- Napisać program Hello World w Haskellu.
- Napisać program, który wypisuje długość wejścia
- Napisać program, który wypisuje swój input
- Napisać program który odwraca swój input (porównać "interaktywność" 3 i 4)
- Napisać program który odwraca każde słowo na wejściu (potem tak samo z każdą linią)
- * Tak samo jak 3, ale żeby wszystko wypisało się dopiero na koniec
- ** Tak samo jak 3, ale żeby wyjście wypisywało się co dwie linijki
- Zadanie 9 z moodla (ignorując newline'y na wejściu)
- Zadanie 9 z moodla respektująć newline'y na wejściu -- dzielimy tylko długie linijki
- (Rozwiązania w Lab2b/Interact.hs)
Lab 3a (09.03)
Lab 3a (09.03)
- Robimy zadanie z moodla o BST (Zadanie 3), ale jescze z funkcją remove :: (Ord a) => BST a -> BST a
- Implementujemy funckje:
- insert
- fromList
- toList (można zapoznać się z Data.DList)
- remove
- (testy można znaleźć w Lab3a/BSTTests.hs)
- Implementujemy instajce Show, Eq i Functor.
- Implementujemy funckje:
- Robimy zadanie z moodla o wyrażeniach (Zadanie 4), na razie bez ELet
- Dla chętnych zadanie o liczeniu pochodniej na codewars (raczej pracochłonne)
- Debugowanie Haskella: Debug.Trace
f :: Int -> Int -> Int
f x y =
| traceShow (x, y) False = undefined
| otherwise = {-- definicja f --}
Dzięki temu, wypiszą się wszystkie argumenty z którymi wywoływane jest F.
Lab 3b (13.03)
Lab 3b (13.03)
- Zajęcia odbywają się zdalnie (wszystkie informacje będzie można znaleźć na Slacku).
- Czytamy rozdział Input and Output z "Learn You a Haskell for Great Good!"
- Można pominąć sekcje Bytestrings i randomness (nie dlatego, że są nieciekawe, tylko dlatego że są trochę mniej w temacie).
- Robimy zadania na IO:
- Napisać program, który odpyta użytkownika z tabliczki mnożenia.
- Podstawowa wersja powinna wyglądać jak tu: mnozenie.txt (tu może przydać się funkcja readMaybe z Text.Read)
- Można dodać wypisywanie na koniec liczby zdobytych punktów. (Podpowiedź: nie trzeba do tego używać IO zmiennych).
- Można dodać pytanie "do skutku" -- komputer będzie pytał się o podpowiedź tak długo jak nie dostanie poprawnej odpowiedzi (tutaj pomocna może być funkcja whileM_, czytając jej typ trzeba zamieniać m na IO)
- Dla chętnych: można urozmaicić program używając losowości.
- Rozwiązanie w wersji 2 można znaleźć w pliku Lab3b/mnożenie_rozwiązanie.hs
- Napisać program, który wczyta od użytkownika nazwę pliku (np. foo) a następnie liczbę naturalną k (np. 3), a następnie utworzy k pustych plików (o nazwach foo1.txt, foo2.txt, foo3.txt).
- Napisać program, który odpyta użytkownika z tabliczki mnożenia.
Lab 4a (16.03)
Lab 4a (16.03)
- Zajęcia dalej odbywają się zdalnie. Dzisiaj ćwiczmy monady: głównie Maybe i Either.
- Na początku wspólnie przechodzimy przez Lab4a/MaybeEitherDemoEmpty.hs (rozwiązanie w Lab4a/MaybeEitherDemo.hs).
- Zadanie: Lab4a/ManyOperations.hs
- Zadanie: Lab4a/MonadicOperations.hs
- Dodatkowo: można przeczytać pierwszy rozdział o monadach z Learn You a Haskell tylko, że on zakłada znajomość poprzedniej sekcji o Funktorach, Aplicative i Monoidach. Sekcję o monoidach można pominąć (nie przydaje się do monad), ale sama w sobie jest bardzo ciekawa.
Lab 4b (19.03)
Lab 4b (19.03)
- Dzisiaj ćwiczymy monadę state (laby odbywają się poprzez slack i meets).
- Na początku wspólnie przechodzimy przez Lab4b/StateDemo.hs (rozwiązanie w StateDemoSolved.hs).
- Zadanie: napisać numerowanie wierzchołków drzewa in-order i pre-order (w stylu StateDemo.hs)
- Jeśli ktoś nie skończył zadań z zeszłego tygodnia, to teraz jest na to dobry czas.
- Trudniejsze: Zadanie The most imperative functional language? z Codewars.
- Można przeczytać fragment z Learn You a Haskell o monadzie State (rozdział For a few monads more).
Lab 5a (23.03)
Lab 5a (23.03)
- Dzisiaj ćwiczymy monadę reader (laby odbywają się poprzez slack i meets).
- Na początku wspólnie przechodziimy przez Lab5a/StateDemo.hs (rozwiązanie w Lab5a/StateDemoFilled.hs)
- Robimy zadanie 2b z Moodla (Lab Monady 2), o interpretowaniu wyrażeń.
- Robimy zadanie 3b z Moodla o interpretowaniu programu imperatywnego, ale jeszcze nie 3c.
- Można przeczytać fragment z Learn You a Haskell o monadzie Reader.
Lab 5b (26.03)
Lab 5b (26.03)
- Dzisiaj ćwiczymy transformatory monad.
- Na początku wspólnie przechodzimy przez Lab5b/TransformersDemo.hs (rozwiązanie w TransformersDemoFilled.hs).
- Potem do zrobienia jest zadanie (częściowo z Moodla) Lab5b/SmallInterpreter.hs
- Można przeczytać wpis o transformatorach monad (zwłaszcza warto zapoznać się z ExceptT -- eleganckiej wersji EitherT).
Lab 6a (30.03)
Lab 6a (30.03)
- Dzisiaj zaczynamy parsery.
- Zaczynamy od BNFC (w szczególności: krótszy i dłuższy tutorial)
- Tworzymy razem gramatykę do prostych wyrażeń, i programów.
- Zadanie na dzisiaj to stworzenie gramatyki i podpięcie jej do interpretera z zeszłego tygodnia -- Lab5b lub Lab5a. (Mogą się trochę nie zgadzać typy tworzone przez BNFC, trzeba będzie albo trochę zmodyfikować interpreter, albo napisać prosty konwerter).
- Przy pracy z bnfc trzeba pamiętać o:
bnfc -m -haskell <nazwa_pliku>
- Umieszczamy pliki wytworzone przez bnfc w podkatalogu (może być ten sam co gramatyka), inaczej zrobi się zamieszanie.
- Jeśli gramatyka nazywa się exp.bnfc, to składnia abstrakcyjna znajduje się w AbsExp.hs, a wyrażenie można sparsować za pomocą
pExp (myLexer s)
pExp i myLexer są w parExp.hs (tworzonego automatyczne z parExp.hs)
Lab 6b (03.04)
Lab 6b (03.04)
- Kontynuujemy parsery.
- Dzisiaj zajmujemy się modułem Parsec (Text.Parsec, Text.ParsecChar, Text.ParsecToken)
- Najpierw przeglądamy razem pliki ParsecSimple.hs i ProgramParser.hs z Lab6b (rozwiązania odpowiednio w plikach *Done.hs).
- Piszemy parser dla języka z tygodnia 5.
- Dla chętnych: tutorial z parseca na Real World Haskell
- (trudniejsze) Dla chętnych: Zadanie z codewars: Writing applicative parsers from scratch
Lab 7a (06.04)
Lab 7a (06.04)
- Testowanie w Haskellu: Hspec + QuickCheck
- Piszemy testy do rozwiązań zadań z pierwszego labu:
- Przechodzimy razem przez Lab7a Solutions.hs is SolutionsSpec.hs
- Dopisujemy więcej testów w Lab7a SolutionsSpec.hs
- Pełną listę oczekiwań (jak
shouldBe
alboshouldThrow
) można znaleźć w Test.Hspec.Expectations - Hint: Monadę IO można testować używając
shouldReturn
icapture
Lab 8a (17.04)
Lab 8a (17.04)
- Dzisiaj zajmiemy się typowaniem (zadanie z moodla), pliki można znaleźć w Lab8a
- Na początku przechodzimy razem przez TypeChecker.hs (rozwiązanie w TypeCheckerDone.hs)
- Muismy otypować rachunek lambda z anotacjami: (\x:int -> f:(int -> int) ->f x)
- Typy to funkcje i inty
- Do zrobienia samemu jest zadanie TypeCheckerString.hs
- mamy dwa typy Int i String i przeciążone operatory + i *
- Dla chętnych: TypeChecker (bez Stringów) tylko, że bez anotacji (\x -> \f -> f x), trzeba samemu domyślać się typów (tu przydazą się zmienne typowe i unfikacja).
- Dla chętnych: j. w tylko, że z polimorficznym let (szczegóły na Moodlu).
Lab 9a (20.04)
Lab 9a (20.04)
- Dzisiaj ostanie zajęcia z Haskella.
- Przeglądamy razem grę snake: https://github.com/ravst/HGE2D
- Do zrobienia samemu jest jakaś modyfikacja tej gry:
- Wyświetlanie wyniku
- Przechodzenie przez ściany (i wychodzenie z drugiej strony)
- Zwiększający się poziom trudności (wąż rusza się coraz szybciej)
- ...
- Można też napisać swoją grę
Prolog
Prolog
Lab 9b (23.04)
Lab 9b (23.04)
- Instalujemy SWI-Prolog.
- Przechodzimy razem przez plik family.pl w Lab9b
- Robimy ćwiczenia z pliku family.pl
Lab 10a (27.04)
Lab 10a (27.04)
- Ćwiczymy listy i liczby naturalne (na razie jako termy 0, s(0), s(s(0)), ...).
- Przechodzimy razem przez pliki nat.pl i list.pl w Lab10a
- Rozwiązania w plikach nat_filled.pl i list_filled.pl
- Kolejne zajęcia 04.05 (poniedziałek) wyjątkowo o 12:30
Lab 11a (04.05)
Lab 11a (04.05)
Lab 12a (11.05)
Lab 12a (11.05)
- Technika "Generate and Test" (Lab12a) -- sortowanie liczb.
- Do przemyślenia -- problem 8. hetmanów.
Lab 12b (15.05)
Lab 12b (15.05)
- Technika "Generate and Test" (Lab12b) -- sudoku.
- Do przemyślenia -- optymalizacje w sudoku, częściowo wypełniony problem N hetmanów.
- Można np poprawić funkcję
doomed_sudoku
tak, żeby wykrywawła sytuacje w której są zmienne do których nic nie pasuje (wykrywanie tego jest całkiem kosztowne, więc nie jest pewne jak bardzo to przyspieszy działanie zwłaszcza w małych przypadkach). - Można też poczytać o CLP(FD): Constraint Logic Programming over Finite Domains w Prologu, zwłascza sekcję Example: Sudoku
Lab 13a (18.05)
Lab 13a (18.05)
- Grafy (Lab13a) -- graphs.pl, fib.pl
- Dzisiaj zajmujemy się grafami, i dodatkowo predykatami
table
iassert
. - O
table
można przeczytać więcej w dokumentacji SWI-Prologu. - Dokumentacja ordset.
- Do zrobienia są zadania z graphs.pl
- Szukanie ścieżki.
- Szukanie cyklu.
- Zadanie o NFA z egzaminu 2014 + wariant na assert.
- BFS
Lab 13b (22.05)
Lab 13b (22.05)
- Technnika "Incomplete Data Structures" Lab13b
- Na zajęciach przechodzimy razem przez plik incomplete_data_structures.pl
- Do zrobienia problemy TODO z incomplete_data_structures.pl:
- Zadania: odwróć, flaga holenderska, quick sort, slowo (f) z Lab Prolog 2 z Moodla (przy użyciu list różnicowych)
- * Kolejka (FIFO, Queue) w Prologu.
- Niemodyfikująca wersja lookup.
- Otwarte drzewa BST.
Smalltalk
Smalltalk
Lab 14a (25.05)
Lab 14a (25.05)
- Instalujemy Dolphin albo Pharo
- Samodzielnie przechdodzimy przez odpowiedni scenariusz z moodla:
- Sekcja: T11 19-25.5 Smalltalk :
- Laboratorium: Smalltalk 1 (Dolphin) albo
- Laboratorium: Smalltalk 1 (Pharo) **NOWE rodziały 2 i 11**
- Gdyb komuś nie zadziałało samo
./pharo-ui
można spróbować./pharo-ui Pharo.image
- Gdyb komuś nie zadziałało samo
- (Dla chętnych) jest też książka Pharo by Example
Lab 14b (29.05)
Lab 14b (29.05)
- Kończymy scenariusz z zeszłego tygodnia (w razie problemów zachęcam do zadawania pytań).
- Jeśli ktoś skończy sceneriusz może przerobić Rozdział 3 (A first application) z Pharo by Example, albo zacząć robić zadania z Moodla z przyszłego tygodnia.
- Można też (oczywiście) zadawać pytania dotyczące dowolnego materiału z tego semestru.
Lab 15a (01.06)
Lab 15a (01.06)
- Robimy zadania z Laboratorium: Smalltalk 2 z Moodla (tydzień T12 26.5-1.6).
- Wpis na stacku jak zrobić kolejkę z dwóch stosów.
- Rozwiązania (pliki .txt) w Lab15a
- Można też skonsultować się w dowolnej innej sprawie.
Lab 15b (05.06)
Lab 15b (05.06)
- Dzisiaj omawialiśmy zadania z zeszłego tygodnia. Rozwiązania do liczb pierwszych można znaleźć w: Lab15b
- W przyszły poniedziałek ostatnie zajęcia -- będziemy kończyli Smalltalka (kolejne zadanie z Moodla).