Расстаемся с мифами о ФП
TRANSCRIPT
λРасстаемся с мифами
о функциональном программировании
Распространенное
— ФП это сложно
— ФП не имеет отношение к практике
— ФП спасает от багов
— Монада над категорией K — это моноид в моноидальной категории эндофункторов End(K)
ФП — это не map/lambda
','.join(map(str, filter(None, account_ids)))
— Давай выпилим эту функциональщину?
Вы все программировали в Ф-стиле
— это математика
— переменные постоянны
— внезапно! x := x + 1
Не все Ф-языки действительно функциональны
— чистых Ф-языков мало
— CL, Clojure и др. поощряют писать в ФП-стиле
— возможно, ваш язык поддерживает ФП
ФП имеет мат. обоснование
— Тьюринг и Черч открыли лямбда-исчисления
— Функции ведут себя как числа
— Каррирование, композиция
— За этим стоит мат. аппарат (в отличии от ООП)
Чему учит ФП?Не хранить состояние,
изолировать ввод-вывод
С состоянием трудно жить
# Class.data = None
obj.set_data(data)
obj.process_data()
obj.send_data()
print obj.data #?
Ввод-вывод где попало
— Абстракции: ORM, логи, сетевые вызовы
— Трудно тестировать
— Монады. Ввод и вывод отдельно, преобразования — отдельно.
λФП учит правильным вещам,
но следовать им трудно (поначалу)
Знакомо?
— Давай добавим здесь лог
— Давай просто прокинем через 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
ФП наводит порядок в коде (и в голове)
Важно знать не Ф-языки, а подход
λВопросы?