Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Functional programming for beginners
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Sobolev Nikita
March 22, 2020
Programming
340
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
adaptix_slides.pdf
sobolevn
0
18
Зачем программисту Twitch (что?) – Алексей Гладких, PythoNN
sobolevn
0
16
MQTT глазами BE для работы с embedded устройствами – Сергей Макаров, PythoNN
sobolevn
0
13
Я в СКРЫТОМ ПУЛЕ: выстраиваем процессы в команде без тильта – Максим Мельников, PythoNN
sobolevn
0
23
Я твой fastapi msgspec'ом ускорял – Александр Целуйко, PythoNN
sobolevn
0
21
Будущее локальных LLM – Алексей Голобурдин, PythoNN
sobolevn
0
110
Чего вы не знали о строках в Python – Василий Рябов, PythoNN
sobolevn
0
270
ИИ-Агенты в каждый дом – Алексей Порядин, PythoNN
sobolevn
0
240
Внутреннее устройство сборки мусора в CPython 3.14+ – Сергей Мирянов, PythoNN
sobolevn
0
160
Other Decks in Programming
See All in Programming
SODA - FACT BOOK(JP)
sodainc
1
40k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
600
オーケストレーション記述言語 Katari
yukikurage
0
240
LLM 101
dalinaum
0
470
私なりのハーネスエンジニアリング ~独自の言語処理系の開発を通して~
seosoft
0
180
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
hasutosasaki
1
2.2k
クラウドエージェントは、 何がそんなに便利なのか / what makes cloud agents so useful
rkaga
5
790
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
350
Next.js: The final boss of Web Performance
guaca
0
380
AI時代のシニアエンジニアとは
yosuke_furukawa
PRO
15
11k
AWS CDKを理解するために公式の定義を深掘って解説してみる / Understanding AWS CDK by Digging into Its Official Definition
akihisaikeda
3
280
Engineering Biometric UX Across Android Versions | DroidKnights 2026
ryunen344
1
190
Featured
See All Featured
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
320
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
2
430
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
1
300
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
2
2.1k
The Curse of the Amulet
leimatthew05
3
17k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
510
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
800
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
540
ラッコキーワード サービス紹介資料
rakko
5
5.7M
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
630
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
610
Reflections from 52 weeks, 52 projects
jeffersonlam
356
22k
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