- 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-ове за ефекти. Операции и синтаксис към всеки от тях
Foldable
Functor
Apply
,Applicative
иTraverse
ApplicativeError
FlatMap
,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