Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Functional programming for beginners
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Sobolev Nikita
March 22, 2020
Programming
330
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Functional programming for beginners
Sobolev Nikita
March 22, 2020
More Decks by Sobolev Nikita
See All by Sobolev Nikita
Чего вы не знали о строках в Python – Василий Рябов, PythoNN
sobolevn
0
240
ИИ-Агенты в каждый дом – Алексей Порядин, PythoNN
sobolevn
0
200
Внутреннее устройство сборки мусора в CPython 3.14+ – Сергей Мирянов, PythoNN
sobolevn
0
120
Генератор байткода и байткод генератора, Михаил Ефимов, PythoNN
sobolevn
0
110
Дотянуться до кремния. HighLoad Python: SIMD, GPU – Пётр Андреев, PythoNN
sobolevn
0
110
Проектирование — это когда чувствуешь, а не какие-то там циферки, Николай Хитров, PythoNN
sobolevn
0
130
Continuous profiling, Давид Джалаев, PythoNN
sobolevn
0
150
Михаил Гурбанов – Are you NATS? @ PythoNN
sobolevn
0
290
Дмитрий Бровкин – Почему исправление опечаток сложнее, чем кажется, и как мы с этим српавляемся @ PythoNN
sobolevn
0
68
Other Decks in Programming
See All in Programming
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
160
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
1
1.2k
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
さぁV100、メモリをお食べ・・・
nilpe
0
130
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
130
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
250
Lessons from Spec-Driven Development
simas
PRO
0
150
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
320
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4k
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
19
6.4k
Vite+ Unified Toolchain for the Web
naokihaba
0
220
LLM Plugin for Node-REDの利用方法と開発について
404background
0
170
Featured
See All Featured
Making Projects Easy
brettharned
120
6.7k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
770
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Code Review Best Practice
trishagee
74
20k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
1.1k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
55k
Music & Morning Musume
bryan
47
7.2k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
150
We Have a Design System, Now What?
morganepeng
55
8.2k
Transcript
Никита Соболев github.com/sobolevn
>_ X Функциональное программирование для новичков
Проблемы определений
Проблемы определений > Функциональный стиль / императивный стиль
Проблемы определений > Функциональный стиль / императивный стиль > Способ
проверки типов: до / во время работы
Проблемы определений > Функциональный стиль / императивный стиль > Способ
проверки типов: до / во время работы > Изменяемые / неизменяемые структуры данных
Проблемы определений > Функциональный стиль / императивный стиль > Способ
проверки типов: до / во время работы > Изменяемые / неизменяемые структуры данных > Поддержка языка
Проблемы определений > Функциональный стиль / императивный стиль > Способ
проверки типов: до / во время работы > Изменяемые / неизменяемые структуры данных > Поддержка языка > Стиль для низкого уровня программирования
Но на самом деле!
def sum_numbers(numbers): ... def generate_numbers(count): ... print(sum_numbers(generate_numbers(5)))
None
Композиция
None
❌ ❌
= типы
А что у нас с типизацией?
А что у нас с типизацией? > С попытками приведения
/ без console.log(1 + 'a')
А что у нас с типизацией? > С попытками приведения
/ без console.log(1 + 'a') > Проверка до выполнения / проверка во время выполнения
А что у нас с типизацией? > С попытками приведения
/ без console.log(1 + 'a') > Проверка до выполнения / проверка во время выполнения > Явные аннотации / скрытые типы
Явная типизация позволяет нам по одному объявлению функции узнать о
ней все!
def sum_numbers(numbers): ... def generate_numbers(count): ... print(sum_numbers(generate_numbers(5)))
def sum_numbers(numbers: List[int]) -> int: ... def generate_numbers(count: int) ->
List[int]: ... print(sum_numbers(generate_numbers(5)))
>_ X Практика
dry-python/returns Делаем неявное – явным 16 github.com/dry-python/returns
{"a": 1}.get(by_key)
None
None
Input -> или
Result[, ] если = значение = ошибка
Maybe[] если = None
Callable[[List[int]], List[str]] 23
Callable[[List[int]], List[str]] • Выбросит ли она исключение? Да? Result[List[int], Exception]
23
Callable[[List[int]], List[str]] • Выбросит ли она исключение? Да? Result[List[int], Exception]
• Является ли наша функция чистой? Нет? IO[List[int]] 23
Callable[[List[int]], List[str]] • Выбросит ли она исключение? Да? Result[List[int], Exception]
• Является ли наша функция чистой? Нет? IO[List[int]] • Все вместе? Конечно! IOResult[List[int], Exception] 23
И более удобная композиция compose, pipe, flow, bind, pipeline, lift
24
None
= типы
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']: ...
None
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']: ...
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': ...
А что если функция зависит от текущего контекста? RequiresContext[Env, Result]
А что если функция асинхронная?
dry-python/returns Делаем неявное – явным 33 github.com/dry-python/returns
Полезные ссылки • https://sobolevn.me/2019/02/python-exceptions- considered-an-antipattern • https://sobolevn.me/2020/02/typed-functional- dependency-injection 34
t.me/ opensource_findings 35
Вопросы? github.com/sobolevn sobolevn.me 36