- 01 – За курса [примерен код]
- Кратка история на функционалното програмиране
- Защо Scala?
- Scala като SCAlable LAnguage. Примерен код
- Инсталиране и инструменти
- Hello World
- Тестове
- 02 – Въведение в езика Scala [код]
- Принципи на Scala
- Примитивни и основни типове. Литерали
- Дефиниции –
val
,var
,def
. Типове и type inference - Функции
- Йеархия на типовете
Null
,Nothing
,Unit
- Контролни структури –
if
,while
,for
. Генератори, филтри и дефиниции. Контролните структури и блоковете като изрази - Основни операции върху
List
,String
,Range
- 03 – Обектно ориентирано програмиране за отчаяни [код]
- Номинално срещу Структурно типизиране
- ООП primer
- Classes
- Object и Companion Objects
- Uniform Access Principle
- Case classes
- Traits
- Дискусия за ООП + ФП
- 04 – Основи на функционалното програмиране [код]
- Функции в математическия смисъл
- Референтна прозрачност (referential transparancy)
- Модел на изчисление чрез заместване (substitution model)
- Функциите като първокласни обекти
- Рекурсия, опашкова рекурсия
- Неизменяемост
- Персистентни структури от данни (
List
,Vector
, ...) - Функционален тип, функционални литерали (ламбда функции)
- Композиция на функции
- Функции от по-висок ред -
map
,filter
,foldLeft
и други
- 05 – Currying, наредени n-торки, колекции [код]
- Currying
fold
и операции чрезfold
- Използване на типовете от определена сигнатура като изразно средство и за насоки за имплементация (примери 1)
- Наредени n-торки
- Връщане на множество резултати чрез n-торки
- Import – включване на елементи от други именовани пространства – пакети и обекти
- Частични функции
- Колекции –
List
,Map
,Set
,Array
- Някои общи операции върху колекции –
map
,filter
,foldLeft
,forall
,exists
,groupBy
,zip
,partition
,splitAt
и други - Йеархия на колекциите
- Изменяеми и неизменяеми колекции
flatten
,flatMap
и връзка сfor
- 06 – Съпоставяне по образци и алгебрични типове от данни (ADTs) [код]
- Съпоставяне по образци (pattern matching) и деструктуриране чрез
match
- Съпоставяне по образци/деструктуриране при дефиниране на променлива (при
val
,var
илиfor
) - Частични функции. Синтаксис за частични функции чрез съпоставяне по образци
- Алгебра. Алгебрични типове от данни (algebraic data types)
- Продуктови типове (product types)
- Сумиращи типове (sum types)
- Комплексност на типове
- Проблеми с
null
- Опционалност и
Option
. Трансформации върхуOption
- Елиминиране на нелегалните състояния чрез ограничаване на възможността за тяхното представяне
- Имплементация на деструктуриране за тип, extractor-и –
unapply
. Примери сEmail
иRegex
- Използване на типовете от определена сигнатура като изразно средство и за насоки за имплементация (примери 2)
- Съпоставяне по образци (pattern matching) и деструктуриране чрез
- 07 – Ефекти и функционална обработка на грешки [код]
- Комплексност на функции
- Ефекти
- Видове ефекти – частичност, изключения/грешки, недетерминизъм, зависимости/конфигурация, логване, изменяемо състояние, вход/изход, асинхронност, и други. Типове зад тях
type
дефинициOption
,Try
. Проблеми с изключениятаEither
. Моделиране на грешки- Комбиниране на ефекти
- IO ефект за вход/изход. Предимства
- Разделение на чисто функционално композитно изграждане на план (без странични ефекти) от изпълнение на плана (водещо до странични ефекти)
- Ковариантност и контравариантност на типове
- Ковариантни и контравариантни ограничения на типовете при използването им
- 08 – Implicits
- 09 – Laziness
- 10 – Конкурентно програмиране [код]
- Трансформиращи, интерактивни и реактивни програми
- Характеристики на физическия свят
- Цел: моделиране на програми, които да са част от физическия свят и да взаимодействат с него
- Конкурентност и паралелилизъм – припрокритие и разлики на термините
- Дистрибутираност и реактивност
- Примери за конкурентни модели
- Какво прави един модел подходящ? Примерни характеристики
- Нужда от комуникация между конкурентни примитиви
- Нишки, happens-before релация върху JVM, проблеми на нишките
- Callback функции. Ползи и проблеми
- Future – ефект за асинхронност
- Моделиране на Future, следвайки ползите и принципите на IO
- Функционалното програмиране като съвкупност от изрази. Декларативност на изразите. Еднозначно определяне на зависимостите чрез изрази, дърво от зависимости (дърво на израз). Пренасяне на свойствата на изразите върху ефектните операции
- Eager и lazy Future-и
- Реализация на Eager Future. Future и Promise. Примерно използване
- Реактивност на Future
- Future в Scala.
ExecutionContext
- Помощни функции при работа с Future за чести сценарии
- Сравнение между асинхронност и синхронност
- Асинхронни HTTP client и HTTP server чрез Future
- Lazy Future. Примери чрез
Task
от библиотеката Monix - (опционално, непокрито на лекцията: ) Актьорски модел. Прости примери. Актьорите като конкурентен примитив
- 11 – Type classes [код]
- Абстрактност като помощно средство в програмирането и абстрактност в математиката
- Какво е type class. Пример чрез моноид
- Контекст в програмния код. Контекстност на type class-овете в Scala
- Context bound
- Защо спазването на аксиомите е важно. Разлика между
fold
иfoldLeft
- Сравнение между ООП класовете и type class-овете
- Полиморфизъм и видове полиморфизъм
- Други type class-ове –
Numeric
,Ordering
, (опционално, непокрито на лекцията: ) типове за информация чрезClassTag
иTypeTag
- Type class-ове за преформатиране, пример за JSON сериализация
- Логически изводи при търсене на implicit стойности, логическа типова система
Monoid
иSemigroup
в библиотеката Cats- Multiversal срещу universal equality,
Eq
в Cats - Пример за type class-ове на повече типове, линейно пространство в Spire
- 12 – Монади и функтори [код към лекцията] [примерен код с квадратни уравнения]
- Ефекти. Абстракция над общите операции на ефекти
- Композиране на функции. Аксиоми
- Ефектни функции
- Монада – type class за композиране на ефектни функции
- Дефиниция на монада чрез compose и unit. Аксиоми
- Дефиниция чрез flatMap и unit. Аксиоми
- Производни операции на монади.
map
,flatten
,zip
,map2
,sequence
и други. Алтернативни дефиници - Реализация на type class за монада, с помощни операции
- Монадни инстанции на основни ефектни типове
- Реализация на Maybe (алтернативно име на Option), монадна инстанция към Maybe и пример за работа с получените монадни операции
- State монада
- Функтори като генерализация на монадите
- Имплементации на функтор и монада в Cats
- Композитност на функтори
- Композитност на монади, описани на случаи, в които се композират, и в които не
- Нули на монади
- Примери за програма, решаваща квадрано уравнение
- 14 – Модулност и Web програмиране със Scala [код към модулност] [код към Web програмиране] [примерен Web магазин]
- Dependency injection. Реализация чрез ООП конструкции. Ползи
- Навързване на зависимостите
- Compile-time dependency injection
- Thin cake pattern
- Как да разделим програмата ни на модули? Ръководени от домейна
- Функционалното програмиране за моделиране на домейн
- Web и HTTP като (инфраструктурен) домейн
- Примери с Play Framework – обща структура, модули, HTTP DSL, routing, контролери, typeclass-ове за JSON сериализация и десериализация, парсване на тялото на request
- Shopping приложение
Имате нужда от инсталиран pandoc.
Проектът има submodule зависимост към reveal.js. При/след клониране на репото инициализирайте модулите:
git submodule update --init
cd lectures
./generate-presentation.sh <лекция>
cd lectures
./build.sh
Свалете пакета REPLesent от https://github.com/marconilanna/REPLesent и го настройте според инструкциите.
Сложете script файловете (*.txt) в директорията на REPLesent и след като го стартирате, изпълнете в конзолата командите:
val replesent = REPLesent(source="02-scala-intro-code.txt",intp=$intp)
import replesent._
като използвате подходящия файл за съответния script.