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

Functional programming for beginners

Functional programming for beginners

Avatar for Sobolev Nikita

Sobolev Nikita

March 22, 2020
Tweet

More Decks by Sobolev Nikita

Other Decks in Programming

Transcript

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

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

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

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

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

    / без console.log(1 + 'a') > Проверка до выполнения / проверка во время выполнения > Явные аннотации / скрытые типы
  6. def sum_numbers(numbers: List[int]) -> int: ... def generate_numbers(count: int) ->

    List[int]: ... print(sum_numbers(generate_numbers(5)))
  7. Callable[[List[int]], List[str]] • Выбросит ли она исключение? Да? Result[List[int], Exception]

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

    • Является ли наша функция чистой? Нет? IO[List[int]] • Все вместе? Конечно! IOResult[List[int], Exception] 23
  9. 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']: ...
  10. 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']: ...
  11. 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': ...