Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Functional programming for beginners

Functional programming for beginners

8c3a2ebf7c2b84f8390d99c7bf8c8a48?s=128

Sobolev Nikita

March 22, 2020
Tweet

Transcript

  1. Никита Соболев github.com/sobolevn

  2. >_ X Функциональное программирование для новичков

  3. Проблемы определений

  4. Проблемы определений > Функциональный стиль / императивный стиль

  5. Проблемы определений > Функциональный стиль / императивный стиль > Способ

    проверки типов: до / во время работы
  6. Проблемы определений > Функциональный стиль / императивный стиль > Способ

    проверки типов: до / во время работы > Изменяемые / неизменяемые структуры данных
  7. Проблемы определений > Функциональный стиль / императивный стиль > Способ

    проверки типов: до / во время работы > Изменяемые / неизменяемые структуры данных > Поддержка языка
  8. Проблемы определений > Функциональный стиль / императивный стиль > Способ

    проверки типов: до / во время работы > Изменяемые / неизменяемые структуры данных > Поддержка языка > Стиль для низкого уровня программирования
  9. Но на самом деле!

  10. def sum_numbers(numbers): ... def generate_numbers(count): ... print(sum_numbers(generate_numbers(5)))

  11. None
  12. Композиция

  13. None
  14. ❌ ❌

  15. = типы

  16. А что у нас с типизацией?

  17. А что у нас с типизацией? > С попытками приведения

    / без console.log(1 + 'a')
  18. А что у нас с типизацией? > С попытками приведения

    / без console.log(1 + 'a') > Проверка до выполнения / проверка во время выполнения
  19. А что у нас с типизацией? > С попытками приведения

    / без console.log(1 + 'a') > Проверка до выполнения / проверка во время выполнения > Явные аннотации / скрытые типы
  20. Явная типизация позволяет нам по одному объявлению функции узнать о

    ней все!
  21. def sum_numbers(numbers): ... def generate_numbers(count): ... print(sum_numbers(generate_numbers(5)))

  22. def sum_numbers(numbers: List[int]) -> int: ... def generate_numbers(count: int) ->

    List[int]: ... print(sum_numbers(generate_numbers(5)))
  23. >_ X Практика

  24. dry-python/returns Делаем неявное – явным 16 github.com/dry-python/returns

  25. {"a": 1}.get(by_key)

  26. None
  27. None
  28. Input -> или

  29. Result[, ] если = значение = ошибка

  30. Maybe[] если = None

  31. Callable[[List[int]], List[str]] 23

  32. Callable[[List[int]], List[str]] • Выбросит ли она исключение? Да? Result[List[int], Exception]

    23
  33. Callable[[List[int]], List[str]] • Выбросит ли она исключение? Да? Result[List[int], Exception]

    • Является ли наша функция чистой? Нет? IO[List[int]] 23
  34. Callable[[List[int]], List[str]] • Выбросит ли она исключение? Да? Result[List[int], Exception]

    • Является ли наша функция чистой? Нет? IO[List[int]] • Все вместе? Конечно! IOResult[List[int], Exception] 23
  35. И более удобная композиция compose, pipe, flow, bind, pipeline, lift

    24
  36. None
  37. = типы

  38. 27 def get_user(user_id: int) -> IOResultE['User']: return _parse_json(_make_request(user_id)) # BOOM

    def _make_request(user_id: int) -> IOResultE[Response]: ... def _parse_json(response: Response) -> ResultE['User']: ...
  39. None
  40. 29 def get_user(user_id: int) -> IOResultE['User']: return IOResult.lift_result( _parse_json, )(_make_request(user))

    def _make_request(user_id: int) -> IOResultE[Response]: ... def _parse_json(response: Response) -> ResultE['User']: ...
  41. 30 def get_user(user_id: int) -> IOResultE['User']: return flow( user_id, _make_request,

    IOResult.lift_result(_parse_json), ) @impure_safe def _make_request(user_id: int) -> Response: ... @safe def _parse_json(response: Response) -> 'User': ...
  42. А что если функция зависит от текущего контекста? RequiresContext[Env, Result]

  43. А что если функция асинхронная?

  44. dry-python/returns Делаем неявное – явным 33 github.com/dry-python/returns

  45. Полезные ссылки • https://sobolevn.me/2019/02/python-exceptions- considered-an-antipattern • https://sobolevn.me/2020/02/typed-functional- dependency-injection 34

  46. t.me/ opensource_findings 35

  47. Вопросы? github.com/sobolevn sobolevn.me 36