Расстаемся с мифами о ФП

17

Click here to load reader

Upload: ivan-grishaev

Post on 13-Apr-2017

269 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Расстаемся с мифами о ФП

λРасстаемся с мифами

о функциональном программировании

Page 2: Расстаемся с мифами о ФП

Распространенное

— ФП это сложно

— ФП не имеет отношение к практике

— ФП спасает от багов

— Монада над категорией K — это моноид в моноидальной категории эндофункторов End(K)

Page 3: Расстаемся с мифами о ФП

ФП — это не map/lambda

','.join(map(str, filter(None, account_ids)))

— Давай выпилим эту функциональщину?

Page 4: Расстаемся с мифами о ФП

Вы все программировали в Ф-стиле

— это математика

— переменные постоянны

— внезапно! x := x + 1

Page 5: Расстаемся с мифами о ФП

Не все Ф-языки действительно функциональны

— чистых Ф-языков мало

— CL, Clojure и др. поощряют писать в ФП-стиле

— возможно, ваш язык поддерживает ФП

Page 6: Расстаемся с мифами о ФП

ФП имеет мат. обоснование

— Тьюринг и Черч открыли лямбда-исчисления

— Функции ведут себя как числа

— Каррирование, композиция

— За этим стоит мат. аппарат (в отличии от ООП)

Page 7: Расстаемся с мифами о ФП

Чему учит ФП?Не хранить состояние,

изолировать ввод-вывод

Page 8: Расстаемся с мифами о ФП

С состоянием трудно жить

# Class.data = None

obj.set_data(data)

obj.process_data()

obj.send_data()

print obj.data #?

Page 9: Расстаемся с мифами о ФП

Ввод-вывод где попало

— Абстракции: ORM, логи, сетевые вызовы

— Трудно тестировать

— Монады. Ввод и вывод отдельно, преобразования — отдельно.

Page 10: Расстаемся с мифами о ФП

λФП учит правильным вещам,

но следовать им трудно (поначалу)

Page 11: Расстаемся с мифами о ФП

Знакомо?

— Давай добавим здесь лог

— Давай просто прокинем через self

— Давай здесь подправим словарь

— Тут просто добавим кешик

Page 12: Расстаемся с мифами о ФП

ООП — сборка паззла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: Расстаемся с мифами о ФП

ООП — сборка паззла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: Расстаемся с мифами о ФП

ФП в Питоне

— Гвидо, ниспошли нам ФП!

— fn.py: умножаете класс на число и получаете функцию list(map(_ * 2, range(5))) == [0,2,4,6,8]

— Протиснуться в ООП трудно

Page 15: Расстаемся с мифами о ФП

ФП — это прогрессивный джипег

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: Расстаемся с мифами о ФП

Итог

ФП учит избегать состояния и изолировать IO

ФП наводит порядок в коде (и в голове)

Важно знать не Ф-языки, а подход

Page 17: Расстаемся с мифами о ФП

λВопросы?