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

Functional programming for beginners

Functional programming for beginners

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': ...