Функциональное программирование

для начинающих

О себе

  • Работаю программистом с 2011 года
  • PHP
  • JavaScript
  • Java
  • Scala
  • 2GIS

TODO: введение
ФП сейчас есть во всех языках. Его в любом случае придётся изучать. Не как 10 лет назад.

Я расскажу больше практики

Что такое функциональное программирование?

Это программирование с использованием функций

Функциональное программирование — Это программирование с использованием чистых функций

Purity

Чистые функции

1. Принимают аргументы

2. Возвращают результат, полученный на основе переданных аргументов

3. Для одних и тех же аргументов результат всегда будет одинаков

4. На любой input возвращают какой-то output заданного типа

4. Не выбрасывают исключений

1. Не читают состояние за пределами функции

2. Не пишут в состояние за пределами функции

5. Не работают с IO (БД, файлы, сеть, ...)

3. Не мутируют входные аргументы

Purity

Чистые функции

6. Не вызывают функции с эффектами

Purity

Чистые функции

TODO: примеры кода

Сравнить с процедурами

Показать пример с referential transparency

Purity

Referential transparency

Если функция referentially transparent, то вызов функции можно заменить на результат её выполнения (и наоборот) и это не повлияет на поведение программы.

Purity

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

Спасибо!

Функциональное программирование для начинающих

By Yury Badalyants

Функциональное программирование для начинающих

  • 160