Функциональноепрограммирование впродуктовой разработке
Алексей Фомкин (http://datamonsters.co)
Для чего же ФПподходит?
ФП отлично работает, когда нетявного состояния и малопобочных эффектов.
Программист
Тонкая ирония и искрометный юмор
Решение
Водка
ТЗ
(это и есть побочный эффект)
var x = 2x = x + 2
var irony = None
def job(programmer, vodka, spec) = { irony = Some("Stupid managers") programmer.drink(vodka).drop(spec)}
Для чего же ФПподходит?
Компиляторы Научные вычисления Исследовательские проекты
Классический веб REST-сервисы Фронтэнд
Разберем простой веб-сервис.
Получаем запрос из сети Загружаем состояние из БД Обновляем состояние в БД Отправляем ответ в сеть
Вся программа это функция!
class DirtyHack[A](val data: A) { def foo[B](f: A => DirtyHack[B]): DirtyHack[B] = { f(data) }}
def read(): DirtyHack[String] = new DirtyHack(readln())
def write(s: String): DirtyHack[Unit] = new DirtyHack(println(s))
def sum(input: String): Int = input.split(' ').map(_.toInt).sum
write("Enter numbers") foo { _ => read() foo { input => write(s"Sum is ${sum(input)}") }}
Побочные эффекты налево Чистые функции направо
trait Functor[F[_]] extends Any { def pure[T](x: T): F[T] def map[B](f: F[A])(pred: A => B): F[B]}
trait Monad[M[_]] extends Functor[M] { def bind[B](f: M[A])(pred: A => M[B]): M[B]}
Да мы занимаемся этим каждый день!
● Изолируем состояние● Абстрагируемся от ввода-вывода● Стараемся не возвращать null
Функция, функтор и монадавместо паттернов GoF.
Многопоточночныеприложения писать прощеиз за неизменяемости
Большая выразительность Меньше кода Меньше ошибок Проще поддерживать
ФП дисциплинирует разум
ФП учит писать красивый код(как Perl, если вы понимаете о чем я)
List(1,2,3,4,5,6).collect({case x if x % 2 == 0 => x *0.5}).sorted.map(_.toString).flatMap(x => List(x, x *2))
Вам не покинуть ФП
Спасибо!
Алексей ФомкинGithub: @fomkin
http://datamonsters.co
Обсуждение!