- 01 – За курса
- 02 – Въведение във функционалното програмиране със Scala [код]
- Scala инструменти
scala
,scalac
, REPL- 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
- Помощен синтаксис при функции
- типови параметри (generics)
- overloading
- default стйности на параметри
- именувани аргументи
- променлив брой параметри
- Функционално програмиране
- математически функции
- функционално срещу императивно програмиране
- характеристики на функционалните програми
- Substitution модел на изчисление. Предаване на параметрите по стойност и по име
- Референтна прозрачност
- Scala инструменти
- 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 модела
- опашкова рекурсия. Рекурсия чрез акумулатори
- рекурсия по колекции
- Неизменимост и неизменими структури от данни
- неизменими обекти във времето
- persistence (персистентност) и structural sharing. Роля на Garbage Collector-а
- персистентност и structural sharing при списък (
List
) Vector
– оптимизация за произволен достъп и добавяне на елементи в началото и в края. Ефективно константна сложност- чисто функционални структури от данни. Безопасно споделяне на такива структури между компоненти и нишки
Set
иMap
като чисто функционални структури
- Функциите като първокласни обекти
- ламбда синтаксис и функционален тип
- преобразуване на
def
функции/методи към обектни функции – eta expansion - частично прилагане на аргументи
- функции от по-висок ред.
filter
,map
,reduce
,fold
- композиция на функции от по-висок ред
- множество списъци с параметри.
- групиране на параметри
- type inference
- създаване на собствени конструкции
- currying
- Операции с функции. Композиция, преобразуване към
curried
илиtupled
форми
- Композиция на функции
- Изразяване чрез типове
- Рекурсия
- 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 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
. Използване на операции вместо pattern matching - Деструктуриране чрез екстрактори. Използването им в pattern matching тук
- 07 – Ефекти и функционална обработка на грешки
- Функционален дизайн – премахване на нелегалните състояния
- От частични към тотални функции
- Ефекти
- Видове ефекти – частичност, изключения/грешки, недетерминизъм, зависимости/конфигурация, логване, изменяемо състояние, вход/изход, асинхронност, и други. Типове зад тях
- Проблемите при изключенията
- Моделиране на грешни състояние чрез
Option
,Try
иEither
- замяна на изключенията с безопасни и композитни ефекти
- моделиране на грешките като домейн структури и домейн логика
- Ефект за вход/изход. IO. Предимства на IO
- Разделение на чисто функционално композитно изграждане на план (без странични ефекти) от изпълнение на плана (водещо до странични ефекти)
- 08 – Конкурентност [код]
- Трансформиращи, интерактивни и реактивни системи
- Характеристики на физическия свят
- Цел: моделиране на програми, които да са част от физическия свят и да взаимодействат с него
- Конкурентност и паралелилизъм – припрокритие и разлики на термините
- Дистрибутираност
- Примери за конкурентни модели
- Какво прави един модел подходящ? Примерни характеристики
- Нужда от комуникация между конкурентни примитиви
- Нишки, комуникация между нишки (чрез споделено състояние), happens-before релация върху JVM, проблеми на нишките
- Реактивност и асинхронност чрез callbacks. Преизползване на нишки чрез thread pool-ове. Проблеми на callbacks
- Future – ефект за асинхронност. Моделиране на Future, следвайки ползите и принципите на IO
- Прехвърляне на свойствата на функционалните изрази върху ефекти.
map
,flatMap
,zip
иzipMap
като средство за описване на зависимости върху ефекти вместо върху сурови стойности - Eager и lazy Future-и
- Дизайн и реализация на eager Future. Връзка към външния – чрез Promise. Примерно използване
- Композитност, реактивност и безопасност на Future
- Асинхронни HTTP client и HTTP server чрез Future
- Конзолен вход/изход със Future – използване на отделен thread pool за блокиращи операции
- Пример – web server за библиотека от книги със web клиент, позволяващ разглеждане на каталога от книги
- Помощни операции върху Future
- трансформация на множество Future-и (
sequence
,firstCompletedOf
) - и на грешки (
recover
,recoverWith
,fallbackTo
и други)
- трансформация на множество Future-и (
- Lazy Future – ще го кръстим lazy IO
- дизайн на интерфейса според нужните операции
- описване на план чрез ADT за IO
- асинхронен интерпретатор на IO
- синхронен интерпретатор на IO
- Предимства на lazy IO през eager Future
- 09 – Type classes [код]
- Абстрактност като помощно средство в програмирането. Абстрактност в математиката
- Какво е type class. Пример чрез моноид
- Контекст в програмния код. Контекстност на type class-овете в Scala
- Характеристики на type class-овете. Операции, композитност, аксиоми
- Context bound
- Логически изводи при търсене на implicit стойности, логическа типова система
- Защо спазването на аксиомите е важно. Пример с паралелен
fold
- Реализация на type class-ове в Scala 3 чрез
given
- Сравнение между ООП класовете и 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
Имате нужда от инсталиран pandoc.
Проектът има submodule зависимост към reveal.js. При/след клониране на репото инициализирайте модулите:
git submodule update –init
Local with Reaveal + Markdown
To be able to successfully load .md files w/ the Markdown plugin and no co policy pass the –allow-file-access-from-files
flag for google chrome. If you use a real browser and not google chrome
you are clearly an adult and can figure out how to fix it for yourself.
cd lectures
./generate-presentation.sh <лекция>
cd lectures
./build.sh