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
Sobolev Nikita
March 22, 2020
Programming
0
270
Functional programming for beginners
Sobolev Nikita
March 22, 2020
Tweet
Share
More Decks by Sobolev Nikita
See All by Sobolev Nikita
PythoNN – Александр Гончаров
sobolevn
0
50
PythoNN – Андрей Пронин
sobolevn
0
95
PythoNN: Василий Рябов – "Парсинг бинарных данных с помощью ctypes, или пишем на питоне как на Си"
sobolevn
0
200
GitHub Planet - OpenSource
sobolevn
0
240
Polymorphism and Typeclasses
sobolevn
2
130
New GitHub Features
sobolevn
0
63
Problems of static analysis in Python
sobolevn
0
130
Announcing typed-linter
sobolevn
0
220
About GitHub Stars
sobolevn
0
180
Other Decks in Programming
See All in Programming
Kotlinの開発でも AIをいい感じに使いたい / Making the Most of AI in Kotlin Development
kohii00
5
1.9k
変化の激しい時代における、こだわりのないエンジニアの強さ
satoshi256kbyte
1
120
JAWS Days 2025のインフラ
komakichi
1
350
たのしいSocketのしくみ / Socket Under a Microscope
coe401_
8
1.4k
Datadog DBMでなにができる? JDDUG Meetup#7
nealle
0
160
Django NinjaによるAPI開発の効率化とリプレースの実践
kashewnuts
1
300
TCAを用いたAmebaのリアーキテクチャ
dazy
0
230
Ça bouge du côté des animations CSS !
goetter
2
160
メンテが命: PHPフレームワークのコンテナ化とアップグレード戦略
shunta27
0
320
Serverless Rust: Your Low-Risk Entry Point to Rust in Production (and the benefits are huge)
lmammino
1
170
CDK開発におけるコーディング規約の運用
yamanashi_ren01
2
260
1年目の私に伝えたい!テストコードを怖がらなくなるためのヒント/Tips for not being afraid of test code
push_gawa
1
660
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7.1k
Building Adaptive Systems
keathley
40
2.4k
Fireside Chat
paigeccino
35
3.2k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.3k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
193
16k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
440
Rebuilding a faster, lazier Slack
samanthasiow
80
8.9k
Product Roadmaps are Hard
iamctodd
PRO
51
11k
Build The Right Thing And Hit Your Dates
maggiecrowley
34
2.5k
Why Our Code Smells
bkeepers
PRO
336
57k
It's Worth the Effort
3n
184
28k
Scaling GitHub
holman
459
140k
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