Распространенное
— ФП это сложно
— ФП не имеет отношение к практике
— ФП спасает от багов
— Монада над категорией K — это моноид в
моноидальной категории эндофункторов End(K)
ФП — это не map/lambda
','.join(map(str, filter(None, account_ids)))
— Давай выпилим эту функциональщину?
Вы все программировали в Ф-стиле
— это математика
— переменные постоянны
— внезапно! x := x + 1
Не все Ф-языки действительно функциональны
— чистых Ф-языков мало
— CL, Clojure и др. поощряют писать в ФП-стиле
— возможно, ваш язык поддерживает ФП
ФП имеет мат. обоснование
— Тьюринг и Черч открыли лямбда-исчисления
— Функции ведут себя как числа
— Каррирование, композиция
— За этим стоит мат. аппарат (в отличии от ООП)
Знакомо?
— Давай добавим здесь лог
— Давай просто прокинем через self
— Давай здесь подправим словарь
— Тут просто добавим кешик
ООП — сборка паззла
class FooPermission(permissions.BasePermission):
def has_permission(self, request, view):
pass
class BarPermission(permissions.BasePermission):
def has_permission(self, request, view):
pass
FooPermission or BarPermission???
ООП — сборка паззла
def has_perm_foo(request): return True
def has_perm_bar(request): return False
def make_perm_any(*funcs):
return lambda request: any(f(request) for f in funcs)
has_perm_foo_or_bar = make_perm_any(
has_perm_foo, has_perm_bar)
ФП в Питоне
— Гвидо, ниспошли нам ФП!
— fn.py: умножаете класс на число и получаете функцию
list(map(_ * 2, range(5))) == [0,2,4,6,8]
— Протиснуться в ООП трудно
ФП — это прогрессивный джипег
body = read_body(input)
show_body(body)
deformed = deform(body, force)
show_body(deformed)
public static class App {
private Body body;
public set_body(Body body)
....
}
Итог
ФП учит избегать состояния и изолировать IO
ФП наводит порядок в коде (и в голове)
Важно знать не Ф-языки, а подход