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

32
Функциональное программирование в продуктовой разработке Алексей Фомкин (http://datamonsters.co)

Upload: tkconf

Post on 15-Apr-2017

53 views

Category:

Software


1 download

TRANSCRIPT

Функциональноепрограммирование впродуктовой разработке

Алексей Фомкин (http://datamonsters.co)

Make JAR not WAR

Для чего же ФПподходит?

ФП отлично работает, когда нетявного состояния и малопобочных эффектов.

Программист

Тонкая ирония и искрометный юмор

Решение

Водка

ТЗ

(это и есть побочный эффект)

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

Обсуждение!