- 01 – За курса [примери]
- Кои сме ние?
- Административни неща
- Защо функционално? Кратка история на функционалното
- Защо Scala?
- Какво ще учим?
- Ресурси
- Примерен код
- 02 – Въведение във функционалното програмиране със Scala [код]
- Инсталиране на Scala
- Scala инструменти
scala,scalac, REPL- IDE. IntelliJ Idea и Metals
- sbt, конфигурация, компилиране, стартиране и тестване
- форматиране
- добавяне на библиотеки
- Типове и литерали
- Дефиниции –
val,var,def,type, функции. Type inference - Файлове и пакети
- Стойностите като обекти (с методи)
ifконтролна структура- "Всичко е израз или дефиниция". Контролните структури и блоквете като изрази
- Типова йеархия.
Any,AnyVal,AnyRef,Unit,Null,Nothing - Java Memory Model
- Контролни структури със странични ефекти –
while,try/catch(и изключения),for - Още контролни структури без странични ефекти – pattern matching, (функционален)
for - Съставни типове
- хетерогенни – наредени n–торки (tuples)
- хомогенни –
Range,List[A],Set[A],Map[K, V]
- Операции над хомогенни колекции –
isEmpty,head,tail,take,drop - Scala 3 и Scala 2 синтаксис
- Помощен синтаксис при функции
- типови параметри (generics)
- overloading
- default стйности на параметри
- именувани аргументи
- променлив брой параметри
- Функционално програмиране
- математически функции
- функционално срещу императивно програмиране
- характеристики на функционалните програми
- Substitution модел на изчисление. Предаване на параметрите по стойност и по име
- Референтна прозрачност
- 03 – ООП във функционален език [код]
- Обектно-ориентирано програмиране като система от обекти
- Съобщения, енкапсулация и late-binding
- ООП като концепция, ортогонална на ФП. ООП в Scala
- Дефиниране на клас. Параметри на клас (конструктори), членове, модификатори на достъп
- Дефиниране на обект
applyметод. Обекти, приложими като функции- Придружаващи обекти
- implicit конверсии
caseкласове за дефиниране на неизминими value обекти- Абстрактни типове – trait
- Uniform Access Principle
- множествено наследяване
- подтипов полиморфизъм
importиexportклаузи- Обвиващи
AnyValкласове. Type safety чрез обвиване на обикновени типове - Изброени типове
- Съвместимост на типове. Номинално и Структурно типизиране
- Структурно типизиране в Scala
- Типова алгебра. Обединение и сечение на типове
- The Expression Problem в Scala. ООП срещу ФП конструкции
- Extension методи – ретроактивно добавяне на методи към тип
- Тестове
- ООП дизайн
- Обектно-ориентирано програмиране като система от обекти
- 04 – Основни подходи при функционалното програмиране [код]
- Рекурсия
- итерация чрез рекурсия
- рекурсия и substitution модела
- опашкова рекурсия. Рекурсия чрез акумулатори
- рекурсия по колекции
- Функциите като първокласни обекти
- ламбда синтаксис и функционален тип
- преобразуване на
defфункции/методи към обектни функции – eta expansion - частично прилагане на аргументи
- функции от по-висок ред.
filter,map,reduce,fold - композиция на функции от по-висок ред
- множество списъци с параметри
- групиране на параметри
- type inference
- създаване на собствени конструкции
- currying
- Операции с функции. Композиция, преобразуване към
curriedилиtupledформи
- Неизменимост и неизменими структури от данни
- неизменими обекти във времето
- persistence (персистентност) и structural sharing. Роля на Garbage Collector-а
- персистентност и structural sharing при списък (
List) Vector– оптимизация за произволен достъп и добавяне на елементи в началото и в края. Ефективно константна сложност- чисто функционални структури от данни. Безопасно споделяне на такива структури между компоненти и нишки
SetиMapкато чисто функционални структури- Наредените n-торки като чусто функционални структури. Операции
- Други приложения на неизменимите структури от данни
- в базите от данни (append-only logs, MVCC, STM и други)
- Git – обектен модел, представляващ immutable snapshot на файлова система
- UI и front-end (примери с Redux и virtual DOM)
- Композиция на функции
- Изразяване чрез типове
- Рекурсия
- 05 – Fold и колекции
- Абстракция чрез
fold,foldLeftиfoldRight. Изразяване на операции чрез тях - Йеархия и дизайн на колекциите в Scala.
- Uniform Return Type principle
- Колекциите като функции (примери за
Seq,Set,Map)
- Честични функции. Частични функции чрез
caseблокове - Още операции върху колекции –
partition,span,splitAt;flatten,flatMap,zip,groupByи други - Тайната за
forконструкциите – синтактична захар върхуmap,flatMapиwithFilter(filter) - Lazy колекции
- нестриктни view-та на колекции
- lazy списъци с мемоизация
- Имплементация на
LazyList
- Абстракция чрез
- 06 – Pattern matching и алгебрични типове от данни (ADTs) [pattern-и]
- Pattern matching. Деструктуриране на обекти
- Pattern matching на различни места
caseблокове – приmatchили на мястата, където се очакват функции или частични функции. Примери сmapиcollect- pattern bindings – съпоставяне с единичен pattern при
for(отляво на генератори и дефиници) и приvalдефиниции
- Алгебрични типове от данни. Примери
- product типове.
caseкласове, наредени n-торки и други - sum типове. Имплементация чрез
sealed traitиenum
- product типове.
- Type bounds (ограничения върху типовите параметри).
- Вариантност. Ковариантност и контравариантност на типове. Вариантност при типовете за функции. Още примери
- Изразяване на опционалност.
nullкато грешка за милиард долара. Имплементация наOptionтип Optionвъвfor- Полезни операции върху
Option. Използване на операции вместо pattern matching - Деструктуриране чрез екстрактори. Използването им в pattern matching (тук)
- 07 – Ефекти и функционална обработка на грешки [код]
- Функционален дизайн – премахване на нелегалните състояния
- От частични към тотални функции
- Комплексност на типове
- Ефекти
- Видове ефекти – частичност, изключения/грешки, недетерминизъм, зависимости/конфигурация, логване, изменяемо състояние, вход/изход, асинхронност, и други. Типове зад тях
- Проблемите при изключенията
- Моделиране на грешни състояние чрез
Option,TryиEither- замяна на изключенията с безопасни и композитни ефекти
- моделиране на грешките като домейн структури и домейн логика
- Ефект за вход/изход. IO. Предимства на IO
- Разделение на чисто функционално композитно изграждане на план (без странични ефекти) от изпълнение на плана (водещо до странични ефекти)
- Имплементация на цялостни конзолни приложения с IO. Todo list и игра на морски шах
- 08 – Конкурентност [код]
- Трансформиращи, интерактивни и реактивни системи
- Характеристики на физическия свят
- Цел: моделиране на програми, които да са част от физическия свят и да взаимодействат с него
- Конкурентност и паралелилизъм – припрокритие и разлики на термините
- Дистрибутираност
- Примери за конкурентни модели
- Какво прави един модел подходящ? Примерни характеристики
- Нужда от комуникация между конкурентни примитиви
- Нишки, комуникация между нишки (чрез споделено състояние), happens-before релация върху JVM, проблеми на нишките
- Преизползване на нишки чрез Thread Pool-ове
- Реактивност и асинхронност чрез callbacks. Проблеми на callbacks
- Асинхронен IO. Моделиране
- Прехвърляне на свойствата на функционалните изрази върху ефекти.
map,flatMap,zipиzipMapкато средство за описване на зависимости върху ефекти вместо върху сурови стойности - Реализация на асинхронен IO
- Композитност, реактивност и безопасност на IO
- Асинхронни HTTP client и HTTP server чрез IO
- Конзолен вход/изход със IO – използване на отделен thread pool за блокиращи операции
- IO от Cats Effect
- Пример – web server за библиотека от книги със web клиент, позволяващ разглеждане на каталога от книги
- Помощни операции върху IO
- трансформация на последователност от IO-та (
parSequence,parTraverse,race) - и на грешки (
recover,recoverWith,orElseи други)
- трансформация на последователност от IO-та (
- Eager Future. Реализация.
- Проблеми с референтната прозрачност при Future
- Предимства на асинхронен IO пред eager Future
- 09 – Type classes [код]
- Абстрактност като помощно средство в програмирането. Абстрактност в математиката
- Какво е type class. Пример чрез моноид
- Контекст в програмния код. Контекстност на type class-овете в Scala.
givenинстанции и контекстниusingпараметри - Характеристики на type class-овете. Операции, композитност, аксиоми
- Context bound
- Логически изводи при търсене на implicit стойности, логическа типова система
- Защо спазването на аксиомите е важно. Пример с паралелен
fold - Реализация на type class-ове в Scala 2 чрез
implicit - Сравнение между ООП класовете и type class-овете
- Полиморфизъм и видове полиморфизъм. Static и late binding. Ретроактивност
- Примери за type class-ове в стандартната библитека на Scala –
Numeric,Ordering - Примери в други езици – Haskell и Rust (и още Rust). Сравнение на тях и Scala
- Библиотеки за type class-ове. Теория на категории
- Type class-ове за форматиране и сериализация, пример за JSON сериализация
MonoidиSemigroupв библиотеката Cats- Допълнителни примери
- Multiversal срещу universal equality,
Eqв Cats - Пример за type class-ове на повече типове, линейно пространство в Spire
- Multiversal срещу universal equality,
- 10 – Монади и апликативи [код]
- Ефекти. Абстракция над общите операции на ефекти
- Композиране на функции. Аксиоми
- Ефектни функции
- Монада – type class за композиране на ефектни функции
- Дефиниция на монада чрез compose и unit. Аксиоми
- Дефиниция чрез flatMap и unit. Аксиоми
- Производни операции на монади.
map,flatten,zip,map2,sequenceи други. Алтернативни дефиници - Реализация на type class за монада, с помощни операции
- Монадни инстанции на основни ефектни типове
- Реализация на Maybe (алтернативно име на Option), монадна инстанция към Maybe и пример за работа с получените монадни операции
Idмонада- State монада
- Функтори като генерализация на монадите. Аксиоми
- Грешни състояния на монади
- Пример за валидация с натрупване на грешките с използване на монада за
Validated - Апликатив. Разликите между монада и апликатив.
- Пример за валидация с натрупване на грешки с апликатив
- Производни операции на апликативи.
map3,map4,sequence,traverse. - Апликативни инстанции на основни ефектни типове
Traversable- генерализация наsequenceиtraverse
- 11 – Cats и Cats Effect [код]
- Typelevel екосистемата
- Cats – библиотека, осигуряваща абстракции за функционално програмиране
- type class-ове
- техни инстанции
- синтаксис
- типове от данни
- тестване на аксиоми
- Типове от данни –
Chain,Validated,Ior,Kleisli,Id,State,FunctionK(или още~>),Nested - Синтаксис за
Option,Either, иValidated - Йеархия от type class-ове
- Type class-ове за сравнение и наредба (
Eq,Hash,PartialOrder,Order). Синтакси - Алгебрични type class-ове.
SemigroupиMonoid. Синтаксис - Тестване на аксиоми – пример с моноид за рационални числа
- Type class-ове за ефекти. Операции и синтаксис към всеки от тях
FoldableFunctorApply,ApplicativeиTraverseApplicativeErrorFlatMap,MonadиMonadError
Parallel– type class за типове, позволяващи последователна (монадна) и паралелна (апликативна) обработка- примери с инстанции за
IO/IO.Par,Either/ValidatedиList/ZipList - синтаксис за
Parallel
- примери с инстанции за
- Композитност на функтор, апликатив и монада
- композиране на функтор и апликатив. Тип
Nested - невъзможност за композиция на монади в общия случай. Композитност при вложени ефекти, които имат
sequence(тоест саTraverse). ТиповеOptionTиEitherTкато решение за тези два конкретни типа
- композиране на функтор и апликатив. Тип
- Всички примери за Cats
- Cats Effect и type class-ове за конкурентност. Имплементацията им в типа
IO - Cats Effect fibers. Thread pool-ове. Реализация на приложение чрез
IO.IOApp - Feature-и на Cats Effect според type class-овете. Йеархия на type class-овете
MonadCancel– добавя възможност за канселиранеSpawn– изпълнение на множество конкурентни fiber-аConcurrent– възможност за описване на безопасен достъп до споделени ресурси (т. нар. Ref) и за изчакване на ресурси (т. нар. Deferred)Clock– описване на достъп до текущото времеTemporal– приспиване на fiber за определено времеUnique– генериране на уникални тоукъниSync– адаптиране на синхронни изчисления (блокиращи и неблокиращи) към ефектни (и асинхронни) такиваAsync– адаптиране на callback-базиран асинхронен API към ефектен такъв- Пример за функционално описване на план чрез всеки от type class-овете. Изпълнение на плана – изпълнение на страничните ефекти (чрез
unsafeRun*методите).
- Безопасен достъп до ресурси, изискващи затваряне.
Resourceефект - Всички примери за Cats Effect
- 12 – Изграждане на Scala приложение [код]
- Как можем да използваме ФП при моделиране на конкретни домейни?
- Избор на IO ефект
- Структуриране на кода
- зависимости и dependency injection. Реализация чрез параметри (на функции или конструктор на клас). Ползи
- навързване на зависимостите. Thin Cake Pattern. Модули като обекти
- Ефектни компоненти и модули чрез
Resource. Безопасни инициализация и затваряне на глобални и локални ресурси
- Kак да разделим програмата ни на модули? Разделение по домейн вместо по слоеве. Ползи
- Връзка със SQL база от данни чрез Doobie
ConnectionIOефект и пробразуване доIO.Транзакции- примери с Doobie.
- заявки
- сериализация на данните към и от заявка
- фрагменти
- Въвеждане и обновяване на данни – единично и на куп
- JSON сериализация и десериализация чрез Circe
- Encoder-и и decoder-и
- Полуавтоматична деривация encoder-и и decoder-и чрез макроси
- Примери със Circe
- HTTP приложения чрез http4s и tapir
- HTTP като ефектна функция от
RequestкъмResponse - HTTP server чрез http4s. Стартиране като
IOApp - HTTP routes – pattern matching по
Request-а - Сериализация и десериализация на entity-та. Връщане и четене на JSON чрез Circe
- Описване на endpoint-и като данни чрез tapir. Интерпретация към сървър и към клиенти
- HTTP клиент чрез http4s и sttp
- Примери с http4s
- Приложение със сървър и клиент за библиотека с http4s, tapir и sttp
- Вариант на приложението само с http4s и http4s client
- Примерен проект с tapir
- HTTP като ефектна функция от
- Функционални конкурентни потоци чрез Fs2
- От
LazyListдо ефектенStream - Функционални трансфомрации на потоци
- Връзка с вход/изход – файловата система, TCP, UDP, ...
- Поточно генериране на резултат от HTTP резултат. Поток от Doobie през http4s сървър до клиент
- Web socket-и чрез Fs2 и http4s
- Topic, Signal и Queue.
SignallingRef. - Имплементация на chat по web socket
- Имплементация на Tic Tac Toe
- Примери с Fs2
- От
- Цялостно примерно приложение за уеб магазин
- Таблица на елементите, съставящи типовата система на Scala
- Възможни образци при pattern matching. Използване на pattern matching
- Вариантност
- Cheat sheet със типовете и инстанциите на Cats
Имате нужда от инсталиран pandoc.
Проектът има submodule зависимост към reveal.js. При/след клониране на репото инициализирайте модулите:
git submodule update --init
cd lectures
./generate-presentation.sh <лекция>
cd lectures
./build.sh