SlideShare uma empresa Scribd logo
1 de 60
Николай Паламарчук
Upwork
Functional Programming basics for
PHP developers
Зачем?
Может это просто хайп?
Зачем это PHP девелоперу?
Это так сложно и непонятно… может не надо?
Будут ли мои программы лучше работать?
Сэкономит ли это наше время/деньги?
Разве это спрашивают на собеседовании?
Что такое “монада”?
Ы?...
Разве нельзя просто писать код?
Зачем оно мне надо?
Можно!
Мы так и делаем!
И оно работает!*
* как нибудь
Но если долго долго быть программистом...
Почему мы не можем уснуть по ночам?
Как писать код без ошибок?
Как писать код правильно?
Какой код правильный?
Что такое код?
В чем смысл жизни программирования?
Почему эти вопросы лезут мне в голову?
Функциональное программирование
Поможет нам приблизиться к
пониманию “что такое хороший код”
Дремучие времена
Готфрид Вильгельм Лейбниц
1646 - 1716
● Великий учёный
● Придумал интеграл
● Занимался физикой
● Делал механический калькулятор
● И вообще красавчик
Да, я такой
Лейбниц -
котик
Считать лениво - нужно
сделать механический
калькулятор
Теоремы доказывать
лениво, нужно сделать
механический
доказыватель теорем
Нужно придумать язык для
описания теорем
механическому устройству
Прошло немного времени
Давид Гильберт
1862 - 1943
● Светило математической науки
● Исследовал теорию чисел
● Озвучил Entscheidungsproblem (проблема
разрешимости)
Entscheidungsproblem:
Найти алгоритм, на вход которому дается
описание формального языка и утверждение
на этом языке, а на выходе мы получаем
“Истинно” или “Ложно” это утверждение
Примерно:
2+2=4
ИСТИНА
Прямая связь с программированием
Найти алгоритм, который даст нам ответы на вопросы:
Будет ли наша программа работать?
Есть ли в программе “баги”?
Может ли наша программа “зависнуть”?
Можно ли написать программу, которая может проверять
другие программы на корректность?
Что такое алгоритм (программа)?
Что такое алгоритм (формально)?
Алонзо ЧёрчАлан Тьюринг
Машина Тьюринга
● Бесконечная лента с ячейками
● Конечный алфавит символов
● Головка записи-чтения (мозг)
○ конечное число состояний
○ конечное число переходов: в
зависимости от состояния и
символа в ячейке может его
поменять, поменять свое
состояние и двинуться
влево/вправо по ленте.
Лямбда-исчисление (придумал Алонзо Чёрч)
1. переменные (x, y, ...)
2. аппликация (M N)
3. лямбда-абстракция (𝛌x.M)
Проще
простого!
Вычисления в лямбда-исчислении
Выражение: х+1
Лямбда-абстракция: F = 𝛌x.(x+1)
Аппликация: F 2 = 𝛌x.(x+1) 2 = x+1 [x:=2] => 2+1
Вычисления в лямбда-исчислении (2)
Бесконечное вычисление:
D = 𝛌x.xx
DD = (𝛌x.xx)(𝛌x.xx) = xx [x:=𝛌x.xx] => (𝛌x.xx)(𝛌x.xx) => ...
F = 𝛌x.y
Вычисление по имени:
F(DD) = (𝛌x.y)(DD) = y[x:=DD] => y
Вычисление по значению:
F(DD) = F((𝛌x.xx)(𝛌x.xx)) => F((𝛌x.xx)(𝛌x.xx)) => ...
Почему “функциональное”?
𝛌-абстракция ведет себя как математическая функция
F = 𝛌x.(x+1) ⇔ F(x) = x+1
● Результат функции зависит только от аргументов
● У функции нет побочных эффектов
● У функции нет внутреннего состояния
К тому же:
● Аргументом функции может быть другая функция
Почему “программирование”?
Тезис Черча: 𝛌-исчисление, машина
Тьюринга и другие формальные понятия
алгоритма - равномощны.
Лямбда и Entscheidungsproblem
𝛌-исчисление позволяет описывать алгоритмы.
Позволяет ли 𝛌-исчисление описать алгоритм, который
будет проверять корректность других алгоритмов?
Лямбда и Entscheidungsproblem (2)
Отнюдь…
В 1936 году Алонзо Черч (а за ним и Тьюринг) доказал,
что такого алгоритма не может существовать.
Доказательство на пальцах: парадокс брадобрея.
Что же делать?
Существуют ли идеальные программы, если не
существует общего алгоритма, по которому мы можем их
проверять на корректность?
А может мы просто ограничимся теми программами,
которые мы можем проверять?
Типизированное лямбда-исчисление
M:𝛕
1. Если переменная x имеет тип 𝛕, то выражение “x”
тоже будет иметь тип 𝛕
2. Если x имеет тип 𝛕, а выражение М имеет тип 𝛔, то
выражение 𝛌x.M будет иметь тип “𝛕→𝛔”
3. Если М имеет тип 𝛕→𝛔, а N имеет тип 𝛕, то M N будет
иметь тип 𝛔
Типизированное 𝛌-исчисление: что оно нам дает?
Типы гарантируют завершаемость вычислений
Типы заставляют нас писать только “хорошие”
программы
Но как жить со всеми этими типами?
Между типами могут быть какие-то отношения
Между значениями и типами могут быть отношения
(например: упорядоченные массивы)
=> Существует довольно нетривиальная теория типов и
куча вопросов по этому поводу
Теория категорий
Что такое “монада”?
Это моноид в
категории
эндофункторов!
Промежуточные выводы
Функциональный подход программирования происходит
от одного из формальных определений алгоритма: 𝛌-
исчисления
Функциональный подход ближе к математике, чем к
суровой действительности
Изучение функционального программирования поможет
нам приблизиться к пониманию “что такое хороший
код”
Функциональный подход и PHP
Функции в PHP
<?php
function plus1($x) { return $x + 1; }
$lambda = function($x) { return $x + 1; };
class Plus1 {
public function __invoke($x) { return $x + 1; }
}
$magicLambda = new Plus1();
$bloodMagicLambda = create_function('$x', 'return $x+1;');
Функции в PHP (2)
<?php
// call a function
plus1(3); // 4
$lambda(3); // 4
call_user_func($magicLambda, 3); // 4
call_user_func('plus1', 3); // 4
// type of a function
get_class($lambda); // “Closure”
get_class($magicLambda); // “Plus1”
gettype($bloodMagicLambda); // “string”
echo $bloodMagicLambda; // “lambda_1“
Рекурсия и ее друзья
<?php
$n = 10;
// sum from 1 to $n
$sum = 0;
for ($i = 1; $i <= $n; $i++) {
$sum = $sum + $i;
}
echo $sum; // 55
Рекурсия и ее друзья (2)
<?php
$n = 10;
// recursion
function sumTo($x) {
if ($x > 0) {
return $x + sumTo($x - 1);
} else {
return 0;
}
}
echo sumTo($n); // 55
Рекурсия и ее друзья (3)
<?php
$n = 10;
// tail recursion
function sumToWithAcc($x, $acc) {
if ($x > 0) {
return sumToWithAcc($x - 1, $acc + $x);
} else {
return $acc;
}
}
function tailSumTo($x) { return sumToWithAcc($x, 0); }
echo tailSumTo($n); // 55
Рекурсия и ее друзья (4)
<?php
$n = 10;
// true lambda (almost)
$sumWithNextOperation = function ($x, $next) {
if ($x > 0) {
return $x + $next($x - 1, $next);
} else {
return 0;
}
};
$lambdaSumTo = function($x) use ($sumWithNextOperation) {
return $sumWithNextOperation($x, $sumWithNextOperation);
};
echo $lambdaSumTo($n); // 55
Каррирование
<?php
$sum3 = function($x, $y, $z) { return $x + $y + $z; };
echo $sum3(1, 3, 4); // 8
// currying
$sumCurry = function($x) {
return function($y) use ($x) {
return function ($z) use ($x, $y) {
return $x + $y + $z;
};
};
};
echo $sumCurry(1)(3)(4); // 8
Функциональные структуры данных: список
<?php
abstract class AList {
public abstract function head();
public abstract function tail(): AList;
public abstract function isEmpty();
use RichList;
}
class EmptyList extends AList {
public function head() { throw new Exception(); }
public function tail(): AList { throw new Exception(); }
public function isEmpty() { return true; }
}
Функциональные структуры данных: список (2)
<?php
class SomeList extends AList {
private $head;
private $tail;
public function __construct($head, AList $tail) {
$this->head = $head;
$this->tail = $tail;
}
public function head() { return $this->head; }
public function tail():AList { return $this->tail; }
public function isEmpty() { return false; }
}
$myList = new SomeList(1, new SomeList(2, new SomeList(3,
new EmptyList()));
Функциональные структуры данных: список (3)
<?php
trait RichList {
function doForEach($callback) {
if (!$this->isEmpty()) {
$callback($this->head());
$this->tail()->doForEach($callback);
}
}
function map($callback) {
return $this->isEmpty()
? new EmptyList()
: new SomeList($callback($this->head()),
$this->tail()->map($callback));
}
}
Функциональные структуры данных: список (4)
<?php
function PrintList(AList $l) {
$l->doForEach(function($e) {
echo "$e|";
});
echo "ENDn";
}
PrintList($myList); // "1|2|3|END"
$double = function($x) { return $x*2; };
PrintList($myList->map($double)); // "2|4|6|END"
Монады
Maybe yes?
Maybe no.
Maybe МОНАДА?
I don’t know.
Монады: что это?
X + Y + Z
getFromDB() + pullFromQeue() + readFromStdin()
Service not
available :(
Empty :( Invalid :(
M(X) + M(Y) + M(Z)
Монады: Maybe
<?php
class Person {
public $name;
public $child;
}
class PersonService {
public static function getPerson(): Person {
// ... load from database
}
}
$getChild = function(Person $p) { return $p->child; };
echo $getChild($getChild(PersonService::getPerson()))->name;
Монады: Maybe (2)
<?php
class MaybePerson {
public function flatMap($f) {
return $this instanceof SomePerson
? $f($this->getPerson())
: new None();
}
}
class SomePerson extends MaybePerson {
private $person;
public function __construct(Person $person) {
$this->person = $person;
}
public function getPerson() { return $this->person; }
}
class None extends MaybePerson {}
Монады: Maybe (3)
<?php
class PersonService {
public static function getPerson(): MaybePerson { … }
}
$maybeSomeone = PersonService::getPerson()
->flatMap($getChild)
->flatMap($getChild);
echo $maybeSomeone instanceof SomePerson
? $maybeSomeone->getPerson()->name
: "No person";
Примеры других монад
<?php
// List
$list = PersonService::getPersons()
->flatMap($getChildren)
->flatMap($getChildren);
// Try
$result = TryMonad::go($operation1)
->flatMap($operation2)
->flatMap($operation3);
echo $result instanceof Success
? $result->value
: $result->error;
Rx
<?php
$observable->subscribe(function ($e) {
echo $e;
});
$observable
->flatMap(function ($i) {
return Observable::of($i + 1);
})
->subscribe(function ($e) {
echo $e;
});
Выводы / Напутствие
Преимущества функционального подхода
1. Программы легко распараллеливаются и тестируются
2. Есть мощный механизм проверки качества программы
- типизация
3. Отсутствие джуниор-девелоперов на проекте :)
Недостатки функционального подхода в PHP
нет функциональных типов
не нужно распараллеливание
нет ленивых вычислений аргументов (вычисление “по
имени”)
нет “хвостовой рекурсии” (что за зверь?)
нет pattern-matching, for-comprehension и других крутых
вещей
много джуниоров
“А зачем?” (в том числе на уровне разработчиков языка)
Но не расстраивайтесь!
Живые программы не очень то
функциональны!
ФП нужны специфические “воркараунды” для связывания
мира и математики.
Например, специализированные языки
программирования.
В образовательных целях... ;)
1. Scala - язык с человеческим лицом
2. Erlang, Elixir
3. Haskell - функциональный язык для фанатов
4. Idris, Agda, Coq - для математиков
5. Lisp, Closure - :))))))))
“В PHP все не так плохо с ФП”
1. https://github.com/lstrojny/functional-php
2. https://github.com/reactphp
3. https://github.com/ReactiveX/RxPHP
4. …
5. ...
Вопросы?
1. Зачем?
2. Я ничего не понял, что делать?
3. Можно ли это использовать в production?
4. А скоро обед?
5. ...

Mais conteúdo relacionado

Mais procurados

Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовMikhail Kurnosov
 
Scala Magic, Alexander Podhaliusin
Scala Magic, Alexander PodhaliusinScala Magic, Alexander Podhaliusin
Scala Magic, Alexander PodhaliusinVasil Remeniuk
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиMikhail Kurnosov
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Roman Orlov
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...corehard_by
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
 
Управляющие структуры в Ruby: условия
Управляющие структуры в Ruby: условияУправляющие структуры в Ruby: условия
Управляющие структуры в Ruby: условияEvgeny Smirnov
 
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Mikhail Kurnosov
 
Основы программирования на ruby
Основы программирования на rubyОсновы программирования на ruby
Основы программирования на rubyEvgeny Smirnov
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компиляторAndrew Aksyonoff
 
Одномерные массивы целых чисел
Одномерные массивы целых чиселОдномерные массивы целых чисел
Одномерные массивы целых чиселAndrey Dolinin
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)Mikhail Kurnosov
 

Mais procurados (19)

Рекурсия. Поиск
Рекурсия. ПоискРекурсия. Поиск
Рекурсия. Поиск
 
Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмов
 
Scala Magic, Alexander Podhaliusin
Scala Magic, Alexander PodhaliusinScala Magic, Alexander Podhaliusin
Scala Magic, Alexander Podhaliusin
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировки
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
 
Python
PythonPython
Python
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
 
Управляющие структуры в Ruby: условия
Управляющие структуры в Ruby: условияУправляющие структуры в Ruby: условия
Управляющие структуры в Ruby: условия
 
Алгоритмы сортировки
Алгоритмы сортировкиАлгоритмы сортировки
Алгоритмы сортировки
 
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
 
Основы программирования на ruby
Основы программирования на rubyОсновы программирования на ruby
Основы программирования на ruby
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компилятор
 
Одномерные массивы целых чисел
Одномерные массивы целых чиселОдномерные массивы целых чисел
Одномерные массивы целых чисел
 
Урок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". КлассыУрок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". Классы
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Алгоритмы поиска
Алгоритмы поискаАлгоритмы поиска
Алгоритмы поиска
 
Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)
 
4 algoritm
4 algoritm4 algoritm
4 algoritm
 

Semelhante a Николай Паламарчук "Functional Programming basics for PHP developers"

Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Technopark
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.sharikdp
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)Smolensk Computer Science Club
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...
Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...
Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...yaevents
 
Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Sergey Tihon
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Technopark
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняAlexander Granin
 
Functional Programing
Functional ProgramingFunctional Programing
Functional ProgramingMax Arshinov
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовAndrew Shitov
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Stfalcon Meetups
 
Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP" Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP" Fwdays
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Dmitri Soshnikov
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#akrakovetsky
 
functional patterns - dotnetconf'11
functional patterns - dotnetconf'11functional patterns - dotnetconf'11
functional patterns - dotnetconf'110xffAA
 
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...Nikolay Grebenshikov
 

Semelhante a Николай Паламарчук "Functional Programming basics for PHP developers" (20)

Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...
Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...
Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...
 
Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
 
Functional Programing
Functional ProgramingFunctional Programing
Functional Programing
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
 
Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP" Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP"
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
 
functional patterns - dotnetconf'11
functional patterns - dotnetconf'11functional patterns - dotnetconf'11
functional patterns - dotnetconf'11
 
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
 

Mais de Fwdays

"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y..."How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...Fwdays
 
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil TopchiiFwdays
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro SpodaretsFwdays
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym KindritskyiFwdays
 
"Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl..."Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl...Fwdays
 
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T..."How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...Fwdays
 
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ..."The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...Fwdays
 
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu..."[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...Fwdays
 
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care..."[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...Fwdays
 
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"..."4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...Fwdays
 
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout", Anast...
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout",  Anast..."Reconnecting with Purpose: Rediscovering Job Interest after Burnout",  Anast...
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout", Anast...Fwdays
 
"Mentoring 101: How to effectively invest experience in the success of others...
"Mentoring 101: How to effectively invest experience in the success of others..."Mentoring 101: How to effectively invest experience in the success of others...
"Mentoring 101: How to effectively invest experience in the success of others...Fwdays
 
"Mission (im) possible: How to get an offer in 2024?", Oleksandra Myronova
"Mission (im) possible: How to get an offer in 2024?",  Oleksandra Myronova"Mission (im) possible: How to get an offer in 2024?",  Oleksandra Myronova
"Mission (im) possible: How to get an offer in 2024?", Oleksandra MyronovaFwdays
 
"Why have we learned how to package products, but not how to 'package ourselv...
"Why have we learned how to package products, but not how to 'package ourselv..."Why have we learned how to package products, but not how to 'package ourselv...
"Why have we learned how to package products, but not how to 'package ourselv...Fwdays
 
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin..."How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...Fwdays
 

Mais de Fwdays (20)

"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y..."How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
 
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
 
"Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl..."Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl...
 
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T..."How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...
 
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ..."The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
 
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu..."[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
 
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care..."[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
 
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"..."4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
 
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout", Anast...
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout",  Anast..."Reconnecting with Purpose: Rediscovering Job Interest after Burnout",  Anast...
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout", Anast...
 
"Mentoring 101: How to effectively invest experience in the success of others...
"Mentoring 101: How to effectively invest experience in the success of others..."Mentoring 101: How to effectively invest experience in the success of others...
"Mentoring 101: How to effectively invest experience in the success of others...
 
"Mission (im) possible: How to get an offer in 2024?", Oleksandra Myronova
"Mission (im) possible: How to get an offer in 2024?",  Oleksandra Myronova"Mission (im) possible: How to get an offer in 2024?",  Oleksandra Myronova
"Mission (im) possible: How to get an offer in 2024?", Oleksandra Myronova
 
"Why have we learned how to package products, but not how to 'package ourselv...
"Why have we learned how to package products, but not how to 'package ourselv..."Why have we learned how to package products, but not how to 'package ourselv...
"Why have we learned how to package products, but not how to 'package ourselv...
 
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin..."How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
 

Николай Паламарчук "Functional Programming basics for PHP developers"

  • 2. Зачем? Может это просто хайп? Зачем это PHP девелоперу? Это так сложно и непонятно… может не надо? Будут ли мои программы лучше работать? Сэкономит ли это наше время/деньги? Разве это спрашивают на собеседовании?
  • 4. Разве нельзя просто писать код? Зачем оно мне надо?
  • 5. Можно! Мы так и делаем! И оно работает!* * как нибудь
  • 6. Но если долго долго быть программистом...
  • 7.
  • 8. Почему мы не можем уснуть по ночам? Как писать код без ошибок? Как писать код правильно? Какой код правильный? Что такое код? В чем смысл жизни программирования? Почему эти вопросы лезут мне в голову?
  • 9. Функциональное программирование Поможет нам приблизиться к пониманию “что такое хороший код”
  • 10. Дремучие времена Готфрид Вильгельм Лейбниц 1646 - 1716 ● Великий учёный ● Придумал интеграл ● Занимался физикой ● Делал механический калькулятор ● И вообще красавчик Да, я такой
  • 11. Лейбниц - котик Считать лениво - нужно сделать механический калькулятор Теоремы доказывать лениво, нужно сделать механический доказыватель теорем Нужно придумать язык для описания теорем механическому устройству
  • 12. Прошло немного времени Давид Гильберт 1862 - 1943 ● Светило математической науки ● Исследовал теорию чисел ● Озвучил Entscheidungsproblem (проблема разрешимости) Entscheidungsproblem: Найти алгоритм, на вход которому дается описание формального языка и утверждение на этом языке, а на выходе мы получаем “Истинно” или “Ложно” это утверждение
  • 14. Прямая связь с программированием Найти алгоритм, который даст нам ответы на вопросы: Будет ли наша программа работать? Есть ли в программе “баги”? Может ли наша программа “зависнуть”? Можно ли написать программу, которая может проверять другие программы на корректность?
  • 15. Что такое алгоритм (программа)?
  • 16. Что такое алгоритм (формально)? Алонзо ЧёрчАлан Тьюринг
  • 17. Машина Тьюринга ● Бесконечная лента с ячейками ● Конечный алфавит символов ● Головка записи-чтения (мозг) ○ конечное число состояний ○ конечное число переходов: в зависимости от состояния и символа в ячейке может его поменять, поменять свое состояние и двинуться влево/вправо по ленте.
  • 18. Лямбда-исчисление (придумал Алонзо Чёрч) 1. переменные (x, y, ...) 2. аппликация (M N) 3. лямбда-абстракция (𝛌x.M) Проще простого!
  • 19. Вычисления в лямбда-исчислении Выражение: х+1 Лямбда-абстракция: F = 𝛌x.(x+1) Аппликация: F 2 = 𝛌x.(x+1) 2 = x+1 [x:=2] => 2+1
  • 20. Вычисления в лямбда-исчислении (2) Бесконечное вычисление: D = 𝛌x.xx DD = (𝛌x.xx)(𝛌x.xx) = xx [x:=𝛌x.xx] => (𝛌x.xx)(𝛌x.xx) => ... F = 𝛌x.y Вычисление по имени: F(DD) = (𝛌x.y)(DD) = y[x:=DD] => y Вычисление по значению: F(DD) = F((𝛌x.xx)(𝛌x.xx)) => F((𝛌x.xx)(𝛌x.xx)) => ...
  • 21. Почему “функциональное”? 𝛌-абстракция ведет себя как математическая функция F = 𝛌x.(x+1) ⇔ F(x) = x+1 ● Результат функции зависит только от аргументов ● У функции нет побочных эффектов ● У функции нет внутреннего состояния К тому же: ● Аргументом функции может быть другая функция
  • 22. Почему “программирование”? Тезис Черча: 𝛌-исчисление, машина Тьюринга и другие формальные понятия алгоритма - равномощны.
  • 23.
  • 24. Лямбда и Entscheidungsproblem 𝛌-исчисление позволяет описывать алгоритмы. Позволяет ли 𝛌-исчисление описать алгоритм, который будет проверять корректность других алгоритмов?
  • 25. Лямбда и Entscheidungsproblem (2) Отнюдь… В 1936 году Алонзо Черч (а за ним и Тьюринг) доказал, что такого алгоритма не может существовать. Доказательство на пальцах: парадокс брадобрея.
  • 26. Что же делать? Существуют ли идеальные программы, если не существует общего алгоритма, по которому мы можем их проверять на корректность? А может мы просто ограничимся теми программами, которые мы можем проверять?
  • 27. Типизированное лямбда-исчисление M:𝛕 1. Если переменная x имеет тип 𝛕, то выражение “x” тоже будет иметь тип 𝛕 2. Если x имеет тип 𝛕, а выражение М имеет тип 𝛔, то выражение 𝛌x.M будет иметь тип “𝛕→𝛔” 3. Если М имеет тип 𝛕→𝛔, а N имеет тип 𝛕, то M N будет иметь тип 𝛔
  • 28. Типизированное 𝛌-исчисление: что оно нам дает? Типы гарантируют завершаемость вычислений Типы заставляют нас писать только “хорошие” программы
  • 29. Но как жить со всеми этими типами? Между типами могут быть какие-то отношения Между значениями и типами могут быть отношения (например: упорядоченные массивы) => Существует довольно нетривиальная теория типов и куча вопросов по этому поводу
  • 31. Что такое “монада”? Это моноид в категории эндофункторов!
  • 32. Промежуточные выводы Функциональный подход программирования происходит от одного из формальных определений алгоритма: 𝛌- исчисления Функциональный подход ближе к математике, чем к суровой действительности Изучение функционального программирования поможет нам приблизиться к пониманию “что такое хороший код”
  • 34. Функции в PHP <?php function plus1($x) { return $x + 1; } $lambda = function($x) { return $x + 1; }; class Plus1 { public function __invoke($x) { return $x + 1; } } $magicLambda = new Plus1(); $bloodMagicLambda = create_function('$x', 'return $x+1;');
  • 35. Функции в PHP (2) <?php // call a function plus1(3); // 4 $lambda(3); // 4 call_user_func($magicLambda, 3); // 4 call_user_func('plus1', 3); // 4 // type of a function get_class($lambda); // “Closure” get_class($magicLambda); // “Plus1” gettype($bloodMagicLambda); // “string” echo $bloodMagicLambda; // “lambda_1“
  • 36. Рекурсия и ее друзья <?php $n = 10; // sum from 1 to $n $sum = 0; for ($i = 1; $i <= $n; $i++) { $sum = $sum + $i; } echo $sum; // 55
  • 37. Рекурсия и ее друзья (2) <?php $n = 10; // recursion function sumTo($x) { if ($x > 0) { return $x + sumTo($x - 1); } else { return 0; } } echo sumTo($n); // 55
  • 38. Рекурсия и ее друзья (3) <?php $n = 10; // tail recursion function sumToWithAcc($x, $acc) { if ($x > 0) { return sumToWithAcc($x - 1, $acc + $x); } else { return $acc; } } function tailSumTo($x) { return sumToWithAcc($x, 0); } echo tailSumTo($n); // 55
  • 39. Рекурсия и ее друзья (4) <?php $n = 10; // true lambda (almost) $sumWithNextOperation = function ($x, $next) { if ($x > 0) { return $x + $next($x - 1, $next); } else { return 0; } }; $lambdaSumTo = function($x) use ($sumWithNextOperation) { return $sumWithNextOperation($x, $sumWithNextOperation); }; echo $lambdaSumTo($n); // 55
  • 40.
  • 41. Каррирование <?php $sum3 = function($x, $y, $z) { return $x + $y + $z; }; echo $sum3(1, 3, 4); // 8 // currying $sumCurry = function($x) { return function($y) use ($x) { return function ($z) use ($x, $y) { return $x + $y + $z; }; }; }; echo $sumCurry(1)(3)(4); // 8
  • 42. Функциональные структуры данных: список <?php abstract class AList { public abstract function head(); public abstract function tail(): AList; public abstract function isEmpty(); use RichList; } class EmptyList extends AList { public function head() { throw new Exception(); } public function tail(): AList { throw new Exception(); } public function isEmpty() { return true; } }
  • 43. Функциональные структуры данных: список (2) <?php class SomeList extends AList { private $head; private $tail; public function __construct($head, AList $tail) { $this->head = $head; $this->tail = $tail; } public function head() { return $this->head; } public function tail():AList { return $this->tail; } public function isEmpty() { return false; } } $myList = new SomeList(1, new SomeList(2, new SomeList(3, new EmptyList()));
  • 44. Функциональные структуры данных: список (3) <?php trait RichList { function doForEach($callback) { if (!$this->isEmpty()) { $callback($this->head()); $this->tail()->doForEach($callback); } } function map($callback) { return $this->isEmpty() ? new EmptyList() : new SomeList($callback($this->head()), $this->tail()->map($callback)); } }
  • 45. Функциональные структуры данных: список (4) <?php function PrintList(AList $l) { $l->doForEach(function($e) { echo "$e|"; }); echo "ENDn"; } PrintList($myList); // "1|2|3|END" $double = function($x) { return $x*2; }; PrintList($myList->map($double)); // "2|4|6|END"
  • 46.
  • 47. Монады Maybe yes? Maybe no. Maybe МОНАДА? I don’t know.
  • 48. Монады: что это? X + Y + Z getFromDB() + pullFromQeue() + readFromStdin() Service not available :( Empty :( Invalid :( M(X) + M(Y) + M(Z)
  • 49. Монады: Maybe <?php class Person { public $name; public $child; } class PersonService { public static function getPerson(): Person { // ... load from database } } $getChild = function(Person $p) { return $p->child; }; echo $getChild($getChild(PersonService::getPerson()))->name;
  • 50. Монады: Maybe (2) <?php class MaybePerson { public function flatMap($f) { return $this instanceof SomePerson ? $f($this->getPerson()) : new None(); } } class SomePerson extends MaybePerson { private $person; public function __construct(Person $person) { $this->person = $person; } public function getPerson() { return $this->person; } } class None extends MaybePerson {}
  • 51. Монады: Maybe (3) <?php class PersonService { public static function getPerson(): MaybePerson { … } } $maybeSomeone = PersonService::getPerson() ->flatMap($getChild) ->flatMap($getChild); echo $maybeSomeone instanceof SomePerson ? $maybeSomeone->getPerson()->name : "No person";
  • 52. Примеры других монад <?php // List $list = PersonService::getPersons() ->flatMap($getChildren) ->flatMap($getChildren); // Try $result = TryMonad::go($operation1) ->flatMap($operation2) ->flatMap($operation3); echo $result instanceof Success ? $result->value : $result->error;
  • 53. Rx <?php $observable->subscribe(function ($e) { echo $e; }); $observable ->flatMap(function ($i) { return Observable::of($i + 1); }) ->subscribe(function ($e) { echo $e; });
  • 55. Преимущества функционального подхода 1. Программы легко распараллеливаются и тестируются 2. Есть мощный механизм проверки качества программы - типизация 3. Отсутствие джуниор-девелоперов на проекте :)
  • 56. Недостатки функционального подхода в PHP нет функциональных типов не нужно распараллеливание нет ленивых вычислений аргументов (вычисление “по имени”) нет “хвостовой рекурсии” (что за зверь?) нет pattern-matching, for-comprehension и других крутых вещей много джуниоров “А зачем?” (в том числе на уровне разработчиков языка)
  • 57. Но не расстраивайтесь! Живые программы не очень то функциональны! ФП нужны специфические “воркараунды” для связывания мира и математики. Например, специализированные языки программирования.
  • 58. В образовательных целях... ;) 1. Scala - язык с человеческим лицом 2. Erlang, Elixir 3. Haskell - функциональный язык для фанатов 4. Idris, Agda, Coq - для математиков 5. Lisp, Closure - :))))))))
  • 59. “В PHP все не так плохо с ФП” 1. https://github.com/lstrojny/functional-php 2. https://github.com/reactphp 3. https://github.com/ReactiveX/RxPHP 4. … 5. ...
  • 60. Вопросы? 1. Зачем? 2. Я ничего не понял, что делать? 3. Можно ли это использовать в production? 4. А скоро обед? 5. ...