SlideShare a Scribd company logo
Теории и практики функционального
программирования
Акуляков Артём
СИБИНФОСОФТ
11-я конференция .NET разработчиков
31 октября 2015
dotnetconf.ru
Кто я?
/ 5+ лет dotNet interpraise
/ 2+ лет python freelance
/ 2+ I love FP
2
К ЧЕМУ ЭТО ВСЕ?
3
Слишком часто слышно...
- я боюсь функционального
программирования!
4
Поговорим об ООП
5
ООП против ФП
6
SOLID
IoC
GRASP
GangOfFour
MVC, MVP, MVVM
CQRS
EventSourcing
DDD
...
ООП против ФП
SOLID
IoC
GRASP
GangOfFour
MVC, MVP, MVVM
CQRS
EventSourcing
DDD
...
Functions
Type
Composition
7
Основы функционального
программирования
8
Функции это тоже значения
9
Функции это тоже значения
let getCalc f x y =
fun z -> (f x) + y + z
let calc = getCalc toX10 1 2
let result = calc value
10
Композиция
11
Композиция : функции
let read (x : string) : int = int(x)
let mult (x : int) : int = x * x
let write (x : int) : string = string(x)
12
Композиция : функции
let readMultWrite1 x =
write (mult (read x))
// x : string -> string
let readMultWrite2 =
read >> mult >> write
// string -> string
13
Композиция
a → b » b → c
a → c
14
Композиция
#большекомпозиции
a → b » b → c » ... » x → z
a → z
15
Композиция : функции
#операторыкомпозиции
let (>>) f1 f2 = fun p -> f1 f2 p
let (<<) f1 f2 = fun p -> f2 f1 p
16
ПРОБЛЕМА: Оператор композиции
определен только для функций с
одним аргументом
17
РЕШЕНИЕ: Все функции это на
самом деле функции от одного
аргумента
18
Композиция : функции
#каррирование
let add x y = x + y // int -> int -> int
let add2 = add 2 // int -> int
let res = add2 2 // val res : int = 4
19
Композиция : функции
#операторыкомпозиции
let (>>) f1 f2 p = f2(f1 p)
let (<<) f1 f2 p = f1(f2 p)
20
Типы
21
Типы
#обзор
type DiscriminatedUnion =
| Variant1 of int
| Variant2 of string
22
Композиция : типы
type LevelName = string
type UID = int
type HierarchyIdentifier =
| Plain of UID
| Complex of LevelName*HierarchyIdentifier
23
Композиция : типы
Complex
(LevelName * Complex
(LevelName *
(Plain)
)
)
24
ООП и ФП имеют много общих
концепций
25
DI
public class BasketCostTranslator : IBasketCostTranslator
{
private readonly IExchangeRateProvider _provider;
public BasketCostTranslator(IExchangeRateProvider p)
{
// =)
}
public BasketCost TranslateCost(BasketCost cost,
Currency currency)
{
// =)
}
}
26
DI
#кариррованиекакdi
type ICostTranslator = BasketCost -> BasketCost
let costTranslator exchangeProvider currency basket =
// =)
let translator = costTranslator cbeRateProvider
let toUsdTranslator = translator Currency.USD
27
DI
#кариррованиекакdi
type ICostTranslator = BasketCost -> BasketCost
let costTranslator exchangeProvider currency basket =
// =)
let translator = costTranslator cbeRateProvider
let toUsdTranslator = translator Currency.USD
28
DI
#кариррованиекакdi
type ICostTranslator = BasketCost -> BasketCost
let costTranslator exchangeProvider currency basket =
// =)
let translator = costTranslator cbeRateProvider
let toUsdTranslator = translator Currency.USD
29
DI
#кариррованиекакdi
type ICostTranslator = BasketCost -> BasketCost
let costTranslator exchangeProvider currency basket =
// =)
let translator = costTranslator cbeRateProvider
let toUsdTranslator = translator Currency.USD
30
Кое-что интересное из мира ФП
31
Мемоизация
32
Мемоизация
#чистыефункции
Чистая функция
– детерминированная
– без побочных эффектов
33
Мемоизация
#чистыефункции
let add100 x =
x + 100
add100 10 // val it : int = 110
add100 10 // val it : int = 110
add100 20 // val it : int = 120
34
Мемоизация
#ультракеширование
let memoize (f: 'a -> 'b) =
let dict = new Dictionary<'a, 'b>()
let memoized (input: 'a) =
match dict.TryGetValue(input) with
| true, x -> x
| false, _ ->
let result = f input
dict.Add(input, result)
result
memoized
let memAdder = memoize adder
35
Мемоизация
#ультракеширование
let memoize (f: 'a -> 'b) =
let dict = new Dictionary<'a, 'b>()
let memoized (input: 'a) =
match dict.TryGetValue(input) with
| true, x -> x
| false, _ ->
let result = f input
dict.Add(input, result)
result
memoized
let memAdder = memoize adder
36
Что не так с обычным
кэшированием?
●
Кэш устарел, а данные не изменились
– Лишняя нагрузка
●
Данные изменились, а кэш еще нет
– Пользователи видят неактуальные данные
37
Мемоизация
#вебприложение
HttpRequest → HttpResponse
38
Мемоизация
#какчистаяфункция
function (HttpRequest) →
HttpResponse
39
Мир неидеален
40
Мемоизация
#всеравночистаяфункция
function (HttpRequest, DbState) →
HttpResponse
41
Мемоизация
#практика
https://github.com/Suor/django-cacheops
42
Сухой итог
●
Функциональное программирование это просто
●
Можно использовать привычные приемы, но
проще
●
Можно заимствовать из функционального
программирования хитрые приемы
43
Полезности
http://www.intuit.ru/studies/courses/471/327/info
https://github.com/fsprojects/FSharpx.Extras
https://github.com/jack-pappas/ExtCore/
http://fsharpforfunandprofit.com/
44
Спасибо за внимание
Вопросы?
Акуляков Артём
СИБИНФОСОФТ
akulyakov.artem@gmail.com
vk.com/oxffaa
Обработка ошибок
46
Что не так с обычной обработкой
ошибок?
Исключения прекрасны, но велик
соблазн «логики на исключениях»
47
Обработка ошибок
#идеальныймир
let handleRequest =
readRequest
>> readEntityFromDB
>> modifyEntity
>> createTaskFromEntity
>> writeTaskToMQ
>> createResultMessage
>> sendMessage
48
49
Мир неидеален
Обработка ошибок
type Result<'r> =
| Success of 'r
| Error
// 'r -> Result<'r>
50
Обработка ошибок
let handleRequest s =
match readRequest s with
| Success r ->
match readEntityFromDB r with
| Success e ->
match modifyEntity e with
| Success me ->
match createTaskFromEntity me with
| Success t ->
match writeTaskToMQ t with
| Success ts ->
createResultMessage ts
| Error -> Error
| Error -> Error
| Error -> Error
| Error -> Error
| Error -> Error
51
А как же композиция?
»
52
'a → Result<'b>
» 'b → Result<'c>
» 'c → Result<'d>
» …
Типы не совпадают...
53
Обработка ошибок
#неработает
Нужно преобразование
('a → Result<'c>) → (Result<'a> → Result<'c>)
54
Обработка ошибок
#решение
Обработка ошибок
#решение
Нужно преобразование
('a → Result<'c>) → (Result<'a> → Result<'c>)
Как?
55
Обработка ошибок
let handleRequest s =
match readRequest s with
| Success r ->
match readEntityFromDB r with
| Success e ->
match modifyEntity e with
| Success me ->
match createTaskFromEntity me with
| Success t ->
match writeTaskToMQ t with
| Success ts ->
createResultMessage ts
| Error -> Error
| Error -> Error
| Error -> Error
| Error -> Error
| Error -> Error
56
Обработка ошибок
#паттернобнаружен
let handleRequest s =
match readRequest s with
| Success r ->
match readEntityFromDB r with
| Success e ->
match modifyEntity e with
| Success me ->
match createTaskFromEntity me with
| Success t ->
match writeTaskToMQ t with
| Success ts ->
createResultMessage ts
| Error -> Error
| Error -> Error
| Error -> Error
| Error -> Error
| Error -> Error
57
Обработка ошибок
#связываем
let bind f =
fun x ->
match x with
| Success r -> f r
| Error -> x
('a → Result<'b>) → (Result<'a> → Result<'b>)
58
Обработка ошибок
#композиция
let handleRequest =
readRequest
>> (bind readEntityFromDB)
>> (bind modifyEntity)
>> (bind createTaskFromEntity)
>> (bind writeTaskToMQ)
>> (bind createResultMessage)
59
Обработка ошибок
#композиция
let handleRequest =
readRequest
>>= readEntityFromDB
>>= modifyEntity
>>= createTaskFromEntity
>>= writeTaskToMQ
>>= createResultMessage
60
Мы только что изобрели монаду
61
Сухой итог
●
Функциональное программирование это просто
●
Можно использовать привычные приемы, но
проще
●
Можно заимствовать из функционального
программирования хитрые приемы
●
Монады совсем нестрашные
62
Спасибо за внимание
Акуляков Артём
СИБИНФОСОФТ
akulyakov.artem@gmail.com
vk.com/oxffaa

More Related Content

PDF
Теории и практики функционального программирования.
PDF
Теории и практики фунционального программирования - GDG D2D
PPTX
тема 2.операторы.линейный алгоритм
PPTX
Статический и динамический полиморфизм в C++, Дмитрий Леванов
PPTX
Статический и динамический полиморфизм в C++, Дмитрий Леванов
PPTX
оператор присваивания и процедуры ввода и вывода
PDF
Step cpp022
PPT
Теории и практики функционального программирования.
Теории и практики фунционального программирования - GDG D2D
тема 2.операторы.линейный алгоритм
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
оператор присваивания и процедуры ввода и вывода
Step cpp022

What's hot (20)

PPT
PDF
апкс 2011 04_verilog_продолж
PDF
Step cpp0201
PPT
паскаль
PPTX
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
PPT
паскаль. часть1
PPT
Огранизация ввода и вывода данных
PDF
СИМПЛЕКС-МЕТОД
PPT
Программирование циклических алгоритмов
PPT
PDF
2.2 Стек вызовов
PDF
3.3 Конструкторы и деструкторы
PDF
5.1 Перегрузка операторов
PDF
parboiled2 – A Macro-Based PEG Parser Generator for Scala 2.10.3+
PPTX
Язык программирования C#
PDF
5.4 Ключевые слова static и inline
PDF
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
PDF
3.1 Структуры
PDF
2. Операторы языка C#
PDF
Введение в синтаксис C++, часть 1
апкс 2011 04_verilog_продолж
Step cpp0201
паскаль
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
паскаль. часть1
Огранизация ввода и вывода данных
СИМПЛЕКС-МЕТОД
Программирование циклических алгоритмов
2.2 Стек вызовов
3.3 Конструкторы и деструкторы
5.1 Перегрузка операторов
parboiled2 – A Macro-Based PEG Parser Generator for Scala 2.10.3+
Язык программирования C#
5.4 Ключевые слова static и inline
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
3.1 Структуры
2. Операторы языка C#
Введение в синтаксис C++, часть 1
Ad

Viewers also liked (20)

PDF
Benefits of using medi weight loss programs to cut excessive weight
DOCX
Folleto
PDF
Weight loss routines in medi weight loss programs
PDF
How to become a data genius?
PPT
Why we prefer ticketgoose
PDF
Pdf del maestro y el robot Mercy
PPTX
Seminario de aspectos juridicos
PDF
Ensayo del maestro y el robot
PDF
Definicion de hardware y software
PDF
ADempiere Education (Spanish Brochure)
PDF
Recursos audiovisuales 2 Victoria
PDF
5 Bad Habits Stunting Your Growth
PDF
Recursos audiovisuales..
PPTX
สงครามกลางเมืองอเมริกา โครงงานคอมพิวเตอร์
PPTX
First Ever - Comprehensive DC Based LED Lighting System
PPTX
Global Talent Program Material
PPTX
Παιδική Εργασία
PPTX
Light and dark wiki
PPTX
Animales y plantas
PDF
Curia on the drag social media strategy
Benefits of using medi weight loss programs to cut excessive weight
Folleto
Weight loss routines in medi weight loss programs
How to become a data genius?
Why we prefer ticketgoose
Pdf del maestro y el robot Mercy
Seminario de aspectos juridicos
Ensayo del maestro y el robot
Definicion de hardware y software
ADempiere Education (Spanish Brochure)
Recursos audiovisuales 2 Victoria
5 Bad Habits Stunting Your Growth
Recursos audiovisuales..
สงครามกลางเมืองอเมริกา โครงงานคอมพิวเตอร์
First Ever - Comprehensive DC Based LED Lighting System
Global Talent Program Material
Παιδική Εργασία
Light and dark wiki
Animales y plantas
Curia on the drag social media strategy
Ad

Similar to functional patterns - dotnetconf'11 (20)

PDF
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
PDF
практические советы по улучшению качества кода
PDF
Инструментируй это
PPTX
Функциональное программирование для разработки распределённых, облачных и веб...
PDF
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
PPTX
Статический анализ кода
PPTX
статический анализ кода
PDF
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
PDF
Behat в PHP с использованием Behat и Mink
PPTX
Эффективный C++
PPTX
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
PDF
Как приручить дракона: введение в LLVM
PDF
Tech Talks @NSU: Как приручить дракона: введение в LLVM
PDF
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
PDF
Язык программирования Scala / Владимир Успенский (TCS Bank)
PPTX
Николай Паламарчук "Functional Programming basics for PHP developers"
PPTX
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
PDF
Пластилиновый код: как перестать кодить и начать жить
PDF
Transpile it.pdf
PDF
Intel IPP Samples for Windows - работа над ошибками
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
практические советы по улучшению качества кода
Инструментируй это
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Статический анализ кода
статический анализ кода
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Behat в PHP с использованием Behat и Mink
Эффективный C++
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Язык программирования Scala / Владимир Успенский (TCS Bank)
Николай Паламарчук "Functional Programming basics for PHP developers"
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
Пластилиновый код: как перестать кодить и начать жить
Transpile it.pdf
Intel IPP Samples for Windows - работа над ошибками

functional patterns - dotnetconf'11