TODO: введение
ФП сейчас есть во всех языках. Его в любом случае придётся изучать. Не как 10 лет назад.
Я расскажу больше практики
1. Принимают аргументы
2. Возвращают результат, полученный на основе переданных аргументов
3. Для одних и тех же аргументов результат всегда будет одинаков
4. На любой input возвращают какой-то output заданного типа
4. Не выбрасывают исключений
1. Не читают состояние за пределами функции
2. Не пишут в состояние за пределами функции
5. Не работают с IO (БД, файлы, сеть, ...)
3. Не мутируют входные аргументы
6. Не вызывают функции с эффектами
TODO: примеры кода
Сравнить с процедурами
Показать пример с referential transparency
def sum(a: Int, b: Int): Int = a + b
def mul(a: Int, b: Int): Int = a * b
def sum(a: Int, b: Int): Int = a + b
def mul(a: Int, b: Int): Int = a * b
val res1 = mul(sum(1, 2), sum(2, 3))
def sum(a: Int, b: Int): Int = a + b
def mul(a: Int, b: Int): Int = a * b
val res1 = mul(sum(1, 2), sum(2, 3))
val res2 = {
val s1 = sum(1, 2)
val s2 = sum(2, 3)
mul(s1, s2)
}
res1
15
res2
15
+ Легко тестировать и дебажить
+ Хорошо композируются
+ Меньше подвержены ошибкам
+ Более предсказуемы в многопоточной среде
+ Код полностью изолирован
+ Отличный local reasoning
- Сигнатуры чистых функций могут быть сложнее
- Не все функции можно сделать чистыми
TODO: Пример на каждый пункт? Переработать слайд?
Чистые функции делают программы чуть лучше в целом
2. Функции с эффектами делают только эффекты, а потом отдают управление чистым функциям.
1. Все функции, которые можно сделать чистыми — делать чистыми.
TODO: а что с данными?
Нам ведь нужно откуда-то брать аргументы для наших чистых функций? Ведь программы состоят не только из поведения, но и из данных.
В фп для этого используются иммутабельные данные. Они хорошо сочетаются с чистыми функциями.
Показать иммутабельные данные.
Показать простой пример, где на вход сперва мутабельная мапа и она в функции мутируется, а в случае с чистой функцией возвращается новая мапина
Показать персистентные коллекции на примере листа из скалы.
Сказать про плюсы и минусы иммутабельности. Из прошлого доклада взять. Важнейший пункт — многопоточность.
TODO: пункт функции как значения.
Простейший пример — map на листе.
Пример с тестами и before и after.
Лучшая композиционность, больше гибкость.
TODO: как использовать то, что я рассказал, прямо сейчас.
1. Комбинаторы вместо циклов
2. Иммутабельность по умолчанию
3. Чистые функции по умолчанию
TODO: пункт про широкий смысл (что изучать дальше)
Про ио монаду.
Про паттерны в фп (функтор, монада, моноид и тд)
Про тайпклассы
Говорящие типы данных (Either, Ior, Option?)
Про стейт менеджмент (данные отдельно от функций, конкурентность через IO и штуки типа Ref)
TODO: Почему фп стал набирать популярность. Потому что в целом программы становятся лучше, понятнее, устойчивее к развитию и проблемам. Плюс многие вещи хорошо подходят к текущим реалиям (многопоточность).
Подумать над конкретными формулировками
lmnet89@gmail.com
Бадальянц Юрий, 2022