Расстаемся с мифами о ФП
TRANSCRIPT
![Page 1: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/1.jpg)
λРасстаемся с мифами
о функциональном программировании
![Page 2: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/2.jpg)
Распространенное
— ФП это сложно
— ФП не имеет отношение к практике
— ФП спасает от багов
— Монада над категорией K — это моноид в моноидальной категории эндофункторов End(K)
![Page 3: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/3.jpg)
ФП — это не map/lambda
','.join(map(str, filter(None, account_ids)))
— Давай выпилим эту функциональщину?
![Page 4: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/4.jpg)
Вы все программировали в Ф-стиле
— это математика
— переменные постоянны
— внезапно! x := x + 1
![Page 5: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/5.jpg)
Не все Ф-языки действительно функциональны
— чистых Ф-языков мало
— CL, Clojure и др. поощряют писать в ФП-стиле
— возможно, ваш язык поддерживает ФП
![Page 6: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/6.jpg)
ФП имеет мат. обоснование
— Тьюринг и Черч открыли лямбда-исчисления
— Функции ведут себя как числа
— Каррирование, композиция
— За этим стоит мат. аппарат (в отличии от ООП)
![Page 7: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/7.jpg)
Чему учит ФП?Не хранить состояние,
изолировать ввод-вывод
![Page 8: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/8.jpg)
С состоянием трудно жить
# Class.data = None
obj.set_data(data)
obj.process_data()
obj.send_data()
print obj.data #?
![Page 9: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/9.jpg)
Ввод-вывод где попало
— Абстракции: ORM, логи, сетевые вызовы
— Трудно тестировать
— Монады. Ввод и вывод отдельно, преобразования — отдельно.
![Page 10: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/10.jpg)
λФП учит правильным вещам,
но следовать им трудно (поначалу)
![Page 11: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/11.jpg)
Знакомо?
— Давай добавим здесь лог
— Давай просто прокинем через self
— Давай здесь подправим словарь
— Тут просто добавим кешик
![Page 12: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/12.jpg)
ООП — сборка паззла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???
![Page 13: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/13.jpg)
ООП — сборка паззла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)
![Page 14: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/14.jpg)
ФП в Питоне
— Гвидо, ниспошли нам ФП!
— fn.py: умножаете класс на число и получаете функцию list(map(_ * 2, range(5))) == [0,2,4,6,8]
— Протиснуться в ООП трудно
![Page 15: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/15.jpg)
ФП — это прогрессивный джипег
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) ....}
![Page 16: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/16.jpg)
Итог
ФП учит избегать состояния и изолировать IO
ФП наводит порядок в коде (и в голове)
Важно знать не Ф-языки, а подход
![Page 17: Расстаемся с мифами о ФП](https://reader037.vdocuments.site/reader037/viewer/2022100411/589b36c01a28ab22038b5117/html5/thumbnails/17.jpg)
λВопросы?