Strony:
Bardzo dobra książka: Learn You a Haskell for Great Good!
Wyszukiwanie funkcji: Hoogle (hoogle.haskell.org)
Pliki na dzisiaj można znaleźć tu: Lab1a
Odpalamy plik HelloWorld.hs w ghci
Przechodzimy razem przez plik Intro.hs
Samodzielnie uzupełniamy luki w Intro.hs
Robimy proste zadania i zadania z Moodla Lab0 -- testy można znaleźć w pliku Tests.hs.
Pliki na dzisiaj można znaleźć tu: Lab1b
Razem przechodzimy przez plik FoldsAndComprehensions.hs
Robimy samodzielnia zadania z Moodla -- Lab0 (rozwiązania w MoodleSolutions.hs).
Robimy samodzielnie zadania z Folds.hs (rozwiązania w FoldsSolved.hs).
Pliki na dzisiaj można znaleźć tu: Lab2a
Razem: Przechodzimy przez plik DataStructures.hs
Samodzielnie: Robimy zadania 1, 2, 3 (pierwsze wystąpienie), 4 (drugie wystąpienie) . Zadania 3 (drugie wystąpienie), 7, 8 zrobimy w środę (rozwiązania w Solutions.hs).
Samodzielnie: Robimy zadania na Sety i Mapy z DataStructures.hs (rozwiązania w DataStructuresSolved.hs).
Można zrobić: Zadanie o kolejce z DataStructures.hs
Można zrobić: Zadania o funktorach z Functors.hs (rozwiązania w FunctorsSolved.hs)
Pliki na dzisiaj można znaleźć tu: Lab2b
Ćwiczymy rekurencję ogonową i leniwość
Razem: przechodzimy przez pliki TailRecAndLazyness.hs oraz Main.hs
Samodzielnie: ćwieczenia z Main.hs, ćwiczenia z TailRecAndLazyness.hs
Można zrobić: Functional streams z codewars.com
Rozwiązania w pliku Solutions.hs
Pliki na dzisiaj: Lab3a
Ćwiczymy moduły i instancje: Przechodzimy razem przez pliki OrderedList.hs, ModuleTest.hs, BST.hs, Expressions.hs
Do samodzielnego dokończenia są pliki OrderedList.hs, BST.hs, Expressions.hs. (Zadania 1-3 z moodla).
Jak ktoś skończy może robić zadania 4 i 6. Zadanie 5 zrobimy w przyszłym tygodniu.
Dla chętnych: Rozdział o Funktorach, Applicative i Monoidach z Learn You a Haskell
Pojawiło się zadanie domowe z Haskella
Pliki na dzisiaj: Lab3b
Ćwiczymy monadę IO.
Razem przechodzimy przez pliki:
HelloWorld.hs
HelloYou.hs
NameTag.hs
ReverseForever.hs
BottlesOfBeer.hs
FavouriteColours.hs
Można zapoznać się z funkcjami: print, sequence, forM, forM_, forever, when.
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.
O plikach, losowości i innych możliwościach IO można poczytać w Learn You a Haskell: Input and Output.
Dzisiaj ćwiczymy monady Maybe i Either.
Przechodzimy razem przez pliki: MaybeEitherDemo.hs, FoldM.hs.
Do zrobienia samodzielnie są zadania z: ManyOperations.hs oraz MonadicOperations.hs
Jak ktoś skończy, można zabrać się za zadania z Moodla: Lab Monady 1
Można przeczytać: pierwszy rozdział o monadach z Learn You a Haskell
Dzisiaj ćwiczymy monadę State (pliki w Lab4b)
Razem przechodzimy przez plik StateDemo.hs
Do zrobienia samodzielnie:
Inorder, preorder
Instancja Monad dla myState2
Można przeczytać fragment z Learn You a Haskell o monadzie State (rozdział For a few monads more).
Dzisiaj ćwiczymy monadę Reader i piszemy pierwszy interpreter (pliki w Lab5a)
Razem przechodzimy przez ReaderDemo.hs
Robimy szybkie omówienie do zadań z zeszłego tygodnia.
Omawiamy typy z pliku Interpreter1OnlyTypes.hs
Robimy zadania 2b i 3b z Moodla (ale jeszcze nie 3c)
Robimy zadania z pliku Operations.hs
Można przeczytać fragment z Learn You a Haskell o monadzie Reader.
Pojawiło się zadanie o interpreterze. Sesja Q&A odbędzie się w środę, więcej informacji na Moodlu.
Dzisiaj ćwiczymy transformatory monad (pliki w Lab6b)
Przechodzimy razem przez TransformersDemo.hs
Samodzielnie robimy zadanie w SmallInterpreter.hs (w trzech wariantach).
Można przeczytać wpis o transformatorach monad (zwłaszcza warto zapoznać się z ExceptT -- eleganckiej wersji EitherT).
Dzisiaj ćwiczymy parsery. Pliki w Lab7a.
Zaczynamy od BNFC (w szczególności: krótszy i dłuższy tutorial).
Zadanie na dzisiaj to stworzenie gramatyki i podpięcie jej do interpretera z zeszłego tygodnia -- Lab5a lub Lab6b. (Mogą się trochę nie zgadzać typy tworzone przez BNFC, trzeba będzie napisać prosty konwerter).
Przy pracy BNFC
bnfc -m -haskell (-p prefiks) <nazwa_pliku>
Typy abstrakcyjne pojawiają się w katalogu ...Abs.hs.
Parser: pExp (myLexer s)
Kontynuujemy parsery. Pliki w Lab7b.
Dzisiaj zajmujemy się modułem Parsec (Text.Parsec, Text.ParsecChar, Text.ParsecToken)
Wspólnie przechodzimy przez pliki ParsecSimple.hs i SimplParser.hs.
Piszemy parser dla języka z labów 5a lub 6b.
Dla chętnych: tutorial z parseca na Real World Haskell
(trudniejsze) Dla chętnych: Zadanie z codewars: Writing applicative parsers from scratch
Ćwiczymy typowanie. Pliki w Lab8a.
Na początku przechodzimy razem przez TypeChecker.hs (rozwiązanie w TypeCheckerDone.hs)
Typujemy rachunek lambda z anotacjami: (\x:int -> f:(int -> int) ->f x)
Typy to funkcje i inty
Do zrobienia samemu jest zadanie TypeCheckerString.hs (tym razem 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).
Bonus: testowanie w Haskellu. Plik SolutionsSpec.hs
Pełną listę oczekiwań (jak shouldBe albo shouldThrow) można znaleźć w Test.Hspec.Expectations
Hint: Monadę IO można testować używając shouldReturn i capture
Dzisiaj mamy ostatnie zajęcia z Haskella.
Przeglądamy razem grę snake: https://github.com/ravst/HGE2D
Do zrobienia samemu jest jakaś modyfikacja tej gry:
Przechodzenie przez ściany
Wyświetlanie wyniku (techniczna modyfikacja)
Rosnąca szybkość
...
Można też napisać własną grę
Instalujemy SWI-Prolog.
Przechodzimy razem przez plik family.pl w Lab9a
Robimy ćwiczenia z pliku family.pl
Dzisiaj ćwiczymy liczby naturalne (jako termy: 0, s(0), s(s(0)), ...) i listy. Pliki w Lab9b.
Przechodzimy razem przez pliki nat.pl i list.pl
Robimy zadania TODO z nat.pl i list.pl
Można też zrobić zadania z Moodla
Przypomnienie: debug włączamy poleceniem trace. , a wyłączamy poleceniem: nodebug.
Pliki na dziś: Lab10b
Ćwiczymy arytmetykę (arithmetics.pl)
Ćwiczymy programowanie niedeterministyczne (generate_and_test.pl)
Pliki na dziś: Lab11b (przede wszystkim sudoku i sudoku_empty).
Dzisiaj robimy trochę bardziej rozbudowany przykład -- sudoku. Przy okazji przećwiczymy różne, aspekty Prologa (np. predykaty wyższych rzędów).
Do pomyślenia: optymalizacje w sudoku. Np. można wykrywać, że w jakieś puste pole nie pasuje już żadna liczba. Można też nieprzypadkowo wybierać zmienną, którą będziemy unifikować.
Można poczytać o predykacie findall.
Można też poczytać o CLP(FD): Constraint Logic Programming over Finite Domains w Prologu, zwłaszcza sekcję Example: Sudoku
Bug: Błąd, którego nie mogłem znaleźć w trakcie zajęć znajdował się w definicji bad_sudoku, trzeba było zamienić w nim contains_repetition na contains_ground_repetition. (W pliku sudoku.pl, wyszystko jest ok).
Pliki na dzisiaj: Lab11b
Ćwiczymy listy różnicowe i inne otwarte strultury danych
Do zrobienia: zadania z diff_lists_etc.pl
Piki na dzisiaj: Lab12a
Dzisiaj zajmujemy się grafami, i dodatkowo predykatami table i assert.
O table można przeczytać więcej w dokumentacji SWI-Prologu.
Dokumentacja ordset.
Do zrobienia są zdania z graphs.pl
Na kolejnych zajęciach będzie już Smalltalk/Pharo.
Zaczynamy Smalltalka (działa tylko na Windowsie) albo Pharo (powinno działać wszędzie). Na części wspólnej labów będziemy pracować w Pharo.
Dzisiaj do zrobienia jest scenariusz z moodla (sekcja T11 18-24.5 Smalltalk 2).
Jest w nim opisane jak zainstalować Pharo. U mnie (macOS) trzeba było zmienić parę poleceń:
mkdir Pharo
cd Pharo
curl -L https://get.pharo.org/64/ | bash
./pharo-ui Pharo.image
(Dla chętnych) jest też książka Pharo by Example
Robimy zadania 1 i 2 (o stosie i kolejce) z Moodla (T12 25.5-31.5).
Link do strony z konstrukcjami w Pharo.
boolValue ifTrue: [...] ifFalse: [...] (konstrukcja if, to metoda Boola)
[... boolExpression] whileTrue: [...] (konstrukcja while, to metoda bloku kodu)
Rozwiązania w Lab13a (w plikach .txt).
Robimy zadanie 3 (o liczbach pierwszych) z Moodla (T12 25.5-31.5).
Można też przepisać własne Booleany, tak, żeby wszystkie metody były klasowe. (Tak żeby zamiast MyFalse new, pisać po prostu MyFalse).
Przydatne konstrukcje:
self subclassResponsibility. (ciało metody, która powinna być abstrakcyjna)
#(1 2 3 4) do: [:x| ...]. (konstrukcja for each, to metoda Kolekcji).
s := WriterStream on: (new String). (tworzenie streamu)
s contents. (wyciąganie ze streamu)
obj printOn: s (pisanie do streamu)
Robimy zadanie o rozdaniach z Moodla (T13 1-11.6).
Rozwiązanie zadania z zeszłego tygodnia jest w: Lab14a
Return w bloku, wychodzi z metody w której blok jest odpalony. Np. metoda test zawsze zwraca true:
test
[^true] value. "value po prostu odplala blok"
^false
Można skonsultować się w sprawie interpretera.
Dzisiaj kończymy Smalltalka (na początku przyszłych zajęć możemy omówić jescze dzisiejsze zadanie).
Plan na przysłość: Typowanie.
Dzisiaj zajmujemy się typowaniem.
Przechodzimy razem przez zadanie o typowaniu z egzaminu poprawkowego z 2015.
Samemu można zrobić zadanie o typowaniu z 2017 roku (prostsze) i zadanie o typowaniu z 2018 roku (trudniejsze).
Dzisiaj zajmujemy się Idrisem. Jest to temat dodatkowy i nieobowiązkowy. Pliki w Lab15a.
Przechodzimy razem przez tutorial.idr
Przydatne linki:
Dzisiaj ostatnie zajęcia. Kontynuujemy Idrisa.
Implementujemy funkcję Printf ze zmienną liczbą argumentów. Kod w Lab15b.
Do pomyślenia: można dodać inne znaczniki: %d %s %b
Jeśli ktoś chce porozmawać, można umawiać się jeszcze na konsultacje.