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
210
Внутреннее устройство сборки мусора в CPython 3.14+ – Сергей Мирянов, PythoNN
sobolevn
0
130
Генератор байткода и байткод генератора, Михаил Ефимов, PythoNN
sobolevn
0
120
Дотянуться до кремния. HighLoad Python: SIMD, GPU – Пётр Андреев, PythoNN
sobolevn
0
120
Проектирование — это когда чувствуешь, а не какие-то там циферки, Николай Хитров, PythoNN
sobolevn
0
140
Continuous profiling, Давид Джалаев, PythoNN
sobolevn
0
160
Михаил Гурбанов – Are you NATS? @ PythoNN
sobolevn
0
310
Дмитрий Бровкин – Почему исправление опечаток сложнее, чем кажется, и как мы с этим српавляемся @ PythoNN
sobolevn
0
69
Other Decks in Programming
See All in Programming
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
2.4k
symfony/aiとlaravel/boost
77web
0
120
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
260
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
110
フィードバックで育てるAI開発
kotaminato
1
110
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.8k
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
230
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
320
初めてのKubernetes 本番運用でハマった話
oku053
0
120
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
5.8k
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
620
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
160
Featured
See All Featured
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
500
Unsuck your backbone
ammeep
672
58k
The Pragmatic Product Professional
lauravandoore
37
7.4k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.3k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
170
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
220
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Making the Leap to Tech Lead
cromwellryan
135
10k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
750
RailsConf 2023
tenderlove
30
1.5k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
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