SlideShare una empresa de Scribd logo
1 de 71
Descargar para leer sin conexión
Теории и практики
функционального
программирования
Акуляков Артем
Кто я?
●
5+ лет dotNet interpraise
●
2+ лет python freelance
●
2+ I love FP
●
Докладчик dotnetconf, dev2dev
●
Организатор it-сообщества dev2dev
2
К чему это все?
3
К чему это все?
●
ФП устарело.
4
ФП устарело, но вот эти ребята еще
не в курсе...
5
К чему это все?
●
ФП устарело.
●
ФП применимо только в узком круге задач.
6
Веб-приложение
HttpRequest → HttpResponse
7
Веб-приложение
function (HttpRequest) → HttpResponse
8
К чему это все?
●
ФП устарело.
●
ФП применимо только в узком круге задач.
●
Я БОЮСЬ ФУНКЦИОНАЛЬНОГО
ПРОГРАММИРОВАНИЯ!
9
Поговорим об ООП
10
ООП против ФП
●
SOLID
●
IoC
●
GRASP
●
GangOfFour
●
MVC, MVP, MVVM
●
CQRS
●
EventSourcing
●
DDD
●
...
11
ООП против ФП
●
SOLID
●
IoC
●
GRASP
●
GangOfFour
●
MVC, MVP, MVVM
●
CQRS
●
EventSourcing
●
DDD
●
...
●
Functions
●
Type
●
Composition
12
ООП против ФП
●
SOLID
●
IoC
●
GRASP
●
GangOfFour
●
MVC, MVP, MVVM
●
CQRS
●
EventSourcing
●
DDD
●
...
●
Functions
●
Type
●
Composition
●
Monads, Monoids...
13
Основы функционального
программирования
14
Функции это тоже значения
15
Функции это тоже значения
let value = 5
let toX10 = fun x -> x * 10
16
Функции это тоже значения
let getCalc f x y =
fun z -> (f x) + y + z
let calc = getCalc toX10 1 2
let result = calc value
17
Композиция
18
Композиция : функции
let read (x : string) : int = int(x)
let mult (x : int) : int = x * x
let write (x : int) : string = string(x)
19
Композиция : функции
let readMultWrite1 x =
write (mult (read x))
// x : string -> string
let readMultWrite2 =
read >> mult >> write
// string -> string
let readMultWrite3 x =
x |> read |> mult |> write
// x : string -> string
20
Композиция
a → b » b → c
a → c
21
Композиция
a → b » b → c » ... » x → z
a → z
22
Композиция : функции
#операторыкомпозиции
let (>>) f1 f2 p = f2(f1 p)
let (<<) f1 f2 p = f1(f2 p)
23
Композиция : функции
#конвейерныеоператоры
let (|>) p f = func param
let (<|) f p = func param
24
Проблема...
Операторы композиции и
конвейера определены только для
функций с одним аргументом
25
Решение!
Все функции это на самом деле
функции от одного аргумента
26
Композиция : функции
#каррирование
let add x y = x + y // int -> int -> int
let add2 = add 2 // int -> int
let res = add2 2 // val res : int = 4
27
Типы
28
Типы
#обзор
type Alias = int
type FunctionAlias = int -> int
29
Типы
#обзор
type Record =
{ field1 : int;
field2 : string }
30
Типы
#обзор
type DiscriminatedUnion =
| Variant1 of int
| Variant2 of string
type Enum = | One = 1 | Two = 2 | Three = 3
31
Типы это не классы
32
Композиция : типы
type NodeName = string
type UID = int
type HierarchyIdentifier =
| Plain of UID
| Complex of NodeName*HierarchyIdentifier
33
Композиция: типы
Complex
(NodeName * Complex
(NodeName * Complex
(Plain)
)
)
34
ООП и ФП имеют много общих
концепций
35
Interfaces & SRP
public interface IExchangeRateProvider
{
ExchangeRate GetRate(Currency currency);
}
public class ExchangeProvider : IExchangeRateProvider
{
public ExchangeRate GetRate(Currency currency)
{
// =)
}
}
36
Interfaces & SRP
#типыфункцийкакинтерфейсы
type IExchangeRateProvider = Currency -> ExchangeRate
let exchangeRateProvider(currency:Currency):ExchangeRate =
// =)
37
DI
public class BasketCostTranslator : IBasketCostTranslator
{
private readonly IExchangeRateProvider _provider;
public BasketCostTranslator(IExchangeRateProvider p)
{
// =)
}
public BasketCost TranslateCost(BasketCost cost)
{
// =)
}
}
38
DI
#кариррованиекакdi
type ICostTranslator = BasketCost -> BasketCost
let costTranslator exchangeProvider basket =
// =)
let translator = costTranslator exchangeRateProvider
39
Шаблонный метод
public class SimpleDeliveryCalculator : IDeliveryCostCalculator
{
public DeliveryOffer Calculate(
IEnumerable<PurchaseDimensions> purchases)
{
// do something
var packagesCount = CalculatePackagesCount(purchases);
// do something
}
protected virtual int CalculatePackagesCount(
IEnumerable<PurchaseDimensions> purchases)
{
// calculation
}
}
40
Шаблонный метод
public class ComplexDeliveryCalculator: SimpleDeliveryCalculator
{
protected override int CalculatePackagesCount(
IEnumerable<PurchaseDimensions> purchases)
{
// "complex" calculation
}
}
41
Шаблонный метод
#композициярулит
let deliveryCalculator packagesCalculator purchases =
// do something
let packagesCount = packagesCalculator purchases
// do something
let simpleCalculatePackages purchases =
// do something
let complexCalculatePackages purchases =
//do something
let calculator1 = deliveryCalculator simpleCalculatePackages
let calculator2 = deliveryCalculator complexCalculatePackages
42
Декоратор
public class LoggingDecorator : IExchangeRateProvider
{
private IExchangeRateProvider _service;
public LoggingDecorator(IExchangeRateProvider service)
{ ... }
public ExchangeRate GetRate(Currency currency) {
// log something
var result = _service.GetRate(currency);
// log something
return result;
}
}
43
Декоратор
#исновакомпозициярулит
let loggingDecorator provider currency =
// log something
let result = provider currency
// log something
result
let provider = loggingDecorator exchangeRateProvider
44
Декоратор
#pyдекораторыпрекрасны
def logging(func):
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
print(func.__name__, args, kwargs)
return res
return wrapper
@logging
def adder(x, y):
return x + y
adder(1, 2)
45
Кое-что интересное из мира ФП
46
Мемоизация
47
Мемоизация
#чистыефункции
let adder x =
x + 100
adder 10 // val it : int = 110
adder 10 // val it : int = 110
adder 20 // val it : int = 120
48
Мемоизация
#ультракеширование
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
49
Мемоизация
#ультракеширование
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
50
Мемоизация
#ультракеширование
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
51
Мемоизация
#практика
function (HttpRequest) →
HttpResponse
52
Мемоизация
#практика
function (HttpRequest, DbState) →
HttpResponse
53
Мемоизация
#практика
https://github.com/Suor/django-cacheops
54
Обработка ошибок
55
Обработка ошибок
#идеальныймир
let handleRequest =
readRequest
>> readEntityFromDB
>> modifyEntity
>> createTaskFromEntity
>> writeTaskToMQ
>> createResultMessage
>> sendMessage
56
Мир неидеален
57
Обработка ошибок
type Result<'r> =
| Success of 'r
| Error
// 'r -> Result<'r>
58
Обработка ошибок
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
59
А как же композиция?
»
60
Обработка ошибок
#неработает
'a → Result<'b>
» 'b → Result<'c>
» 'c → Result<'d>
» …
Типы не совпадают...
61
Обработка ошибок
#решение
Нужно преобразование
('a → Result<'c>) → (Result<'a> → Result<'c>)
62
Обработка ошибок
#решение
Нужно преобразование
('a → Result<'c>) → (Result<'a> → Result<'c>)
Как?
63
Обработка ошибок
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
64
Обработка ошибок
#паттернобнаружен
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
65
Обработка ошибок
#связываем
let bind f =
fun x ->
match x with
| Success r -> f r
| Error -> x
('a → Result<'b>) → (Result<'a> → Result<'b>)
66
Обработка ошибок
#композиция
let handleRequest =
readRequest
>> (bind readEntityFromDB)
>> (bind modifyEntity)
>> (bind createTaskFromEntity)
>> (bind writeTaskToMQ)
>> (bind createResultMessage)
67
Мы только что изобрели монаду
68
Сухой итог
●
Функциональное программирование это просто
●
Можно использовать привычные приемы, но
проще
●
Можно заимствовать из функционального
программирования хитрые приемы
●
Монады совсем не страшные
69
Полезности
http://www.intuit.ru/studies/courses/471/327/info
https://github.com/fsprojects/FSharpx.Extras
https://github.com/jack-pappas/ExtCore/
http://fsharpforfunandprofit.com/
70
Вопросы?
71

Más contenido relacionado

La actualidad más candente

Scala Magic, Alexander Podhaliusin
Scala Magic, Alexander PodhaliusinScala Magic, Alexander Podhaliusin
Scala Magic, Alexander PodhaliusinVasil Remeniuk
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Roman Orlov
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...OdessaFrontend
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
 
оператор присваивания и процедуры ввода и вывода
оператор присваивания и процедуры ввода и выводаоператор присваивания и процедуры ввода и вывода
оператор присваивания и процедуры ввода и выводаliza2209
 
Базовые операторы Java
Базовые операторы JavaБазовые операторы Java
Базовые операторы Javametaform
 
C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.Igor Shkulipa
 
Глава 3: примитивные типы и операции с ними в Java
Глава 3: примитивные типы и операции с ними в JavaГлава 3: примитивные типы и операции с ними в Java
Глава 3: примитивные типы и операции с ними в Javametaform
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияYandex
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
апкс 2011 05_verilog
апкс 2011 05_verilogапкс 2011 05_verilog
апкс 2011 05_verilogIrina Hahanova
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
parboiled2 – A Macro-Based PEG Parser Generator for Scala 2.10.3+
parboiled2 – A Macro-Based PEG Parser Generator for Scala 2.10.3+parboiled2 – A Macro-Based PEG Parser Generator for Scala 2.10.3+
parboiled2 – A Macro-Based PEG Parser Generator for Scala 2.10.3+Alexander Myltsev
 
Глава1: Обзор технологии Java
Глава1: Обзор технологии JavaГлава1: Обзор технологии Java
Глава1: Обзор технологии Javametaform
 

La actualidad más candente (19)

Scala Magic, Alexander Podhaliusin
Scala Magic, Alexander PodhaliusinScala Magic, Alexander Podhaliusin
Scala Magic, Alexander Podhaliusin
 
паскаль
паскальпаскаль
паскаль
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
 
оператор присваивания и процедуры ввода и вывода
оператор присваивания и процедуры ввода и выводаоператор присваивания и процедуры ввода и вывода
оператор присваивания и процедуры ввода и вывода
 
Базовые операторы Java
Базовые операторы JavaБазовые операторы Java
Базовые операторы Java
 
C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.
 
Глава 3: примитивные типы и операции с ними в Java
Глава 3: примитивные типы и операции с ними в JavaГлава 3: примитивные типы и операции с ними в Java
Глава 3: примитивные типы и операции с ними в Java
 
Python
PythonPython
Python
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
апкс 2011 05_verilog
апкс 2011 05_verilogапкс 2011 05_verilog
апкс 2011 05_verilog
 
Lecture 5
Lecture 5Lecture 5
Lecture 5
 
Lecture 8
Lecture 8Lecture 8
Lecture 8
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
parboiled2 – A Macro-Based PEG Parser Generator for Scala 2.10.3+
parboiled2 – A Macro-Based PEG Parser Generator for Scala 2.10.3+parboiled2 – A Macro-Based PEG Parser Generator for Scala 2.10.3+
parboiled2 – A Macro-Based PEG Parser Generator for Scala 2.10.3+
 
Глава1: Обзор технологии Java
Глава1: Обзор технологии JavaГлава1: Обзор технологии Java
Глава1: Обзор технологии Java
 
Цикл
Цикл Цикл
Цикл
 

Destacado

Definicion de hardware y software Victoria
Definicion de  hardware y software   VictoriaDefinicion de  hardware y software   Victoria
Definicion de hardware y software Victoriaeslyvictora
 
Մարկ Հովհաննիսյան (2)
Մարկ Հովհաննիսյան (2)Մարկ Հովհաննիսյան (2)
Մարկ Հովհաննիսյան (2)Tamara Marimyan
 
Tecnologia educativa
Tecnologia educativaTecnologia educativa
Tecnologia educativaortegaceleste
 
LICEO DE LOJA - ESTUDIANTES DE PRIMERO "A" SEMBRANDO
LICEO DE LOJA - ESTUDIANTES DE PRIMERO "A" SEMBRANDOLICEO DE LOJA - ESTUDIANTES DE PRIMERO "A" SEMBRANDO
LICEO DE LOJA - ESTUDIANTES DE PRIMERO "A" SEMBRANDONelly Arrobo Rodas
 
Pdf del maestro y el robot heidy
Pdf del maestro y el robot heidyPdf del maestro y el robot heidy
Pdf del maestro y el robot heidycelestitita
 
Once tiros un poco mas de la historia
Once tiros un poco mas de la historiaOnce tiros un poco mas de la historia
Once tiros un poco mas de la historiaDeborahcabral1986
 
programa+de+manejo+ambiental
programa+de+manejo+ambientalprograma+de+manejo+ambiental
programa+de+manejo+ambientallaura_campos07
 
Recursos audiovisuales..
Recursos audiovisuales..Recursos audiovisuales..
Recursos audiovisuales..Daynariz
 
Calidad,productividad y competitividad.
Calidad,productividad y competitividad.Calidad,productividad y competitividad.
Calidad,productividad y competitividad.Jairo Duran
 
Online Behaviors in Key International & Emerging Markets
Online Behaviors in Key International & Emerging MarketsOnline Behaviors in Key International & Emerging Markets
Online Behaviors in Key International & Emerging MarketsFrederic Gonzalo
 
Will there be ‘content shock’ in travel?
Will there be ‘content shock’ in travel?Will there be ‘content shock’ in travel?
Will there be ‘content shock’ in travel?Frederic Gonzalo
 

Destacado (16)

Definicion de hardware y software Victoria
Definicion de  hardware y software   VictoriaDefinicion de  hardware y software   Victoria
Definicion de hardware y software Victoria
 
Gost 24562 81
Gost 24562 81Gost 24562 81
Gost 24562 81
 
Մարկ Հովհաննիսյան (2)
Մարկ Հովհաննիսյան (2)Մարկ Հովհաննիսյան (2)
Մարկ Հովհաննիսյան (2)
 
Tecnologia educativa
Tecnologia educativaTecnologia educativa
Tecnologia educativa
 
Specialist palliative care services - Support for aged care services presente...
Specialist palliative care services - Support for aged care services presente...Specialist palliative care services - Support for aged care services presente...
Specialist palliative care services - Support for aged care services presente...
 
Mindomo
MindomoMindomo
Mindomo
 
LICEO DE LOJA - ESTUDIANTES DE PRIMERO "A" SEMBRANDO
LICEO DE LOJA - ESTUDIANTES DE PRIMERO "A" SEMBRANDOLICEO DE LOJA - ESTUDIANTES DE PRIMERO "A" SEMBRANDO
LICEO DE LOJA - ESTUDIANTES DE PRIMERO "A" SEMBRANDO
 
Govardhana cv
Govardhana cvGovardhana cv
Govardhana cv
 
20160213 Recés Quaresma ACO-MPCB
20160213 Recés Quaresma ACO-MPCB20160213 Recés Quaresma ACO-MPCB
20160213 Recés Quaresma ACO-MPCB
 
Pdf del maestro y el robot heidy
Pdf del maestro y el robot heidyPdf del maestro y el robot heidy
Pdf del maestro y el robot heidy
 
Once tiros un poco mas de la historia
Once tiros un poco mas de la historiaOnce tiros un poco mas de la historia
Once tiros un poco mas de la historia
 
programa+de+manejo+ambiental
programa+de+manejo+ambientalprograma+de+manejo+ambiental
programa+de+manejo+ambiental
 
Recursos audiovisuales..
Recursos audiovisuales..Recursos audiovisuales..
Recursos audiovisuales..
 
Calidad,productividad y competitividad.
Calidad,productividad y competitividad.Calidad,productividad y competitividad.
Calidad,productividad y competitividad.
 
Online Behaviors in Key International & Emerging Markets
Online Behaviors in Key International & Emerging MarketsOnline Behaviors in Key International & Emerging Markets
Online Behaviors in Key International & Emerging Markets
 
Will there be ‘content shock’ in travel?
Will there be ‘content shock’ in travel?Will there be ‘content shock’ in travel?
Will there be ‘content shock’ in travel?
 

Similar a Теории и практики фунционального программирования - GDG D2D

практические советы по улучшению качества кода
практические советы по улучшению качества кодапрактические советы по улучшению качества кода
практические советы по улучшению качества кодаYuri Afanasiev
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Mikhail Kurnosov
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел СычевYandex
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.Roman Brovko
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMTech Talks @NSU
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1Michael Karpov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняAlexander Granin
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Dmitri Soshnikov
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.Igor Shkulipa
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETDev2Dev
 
Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Levon Avakyan
 

Similar a Теории и практики фунционального программирования - GDG D2D (20)

практические советы по улучшению качества кода
практические советы по улучшению качества кодапрактические советы по улучшению качества кода
практические советы по улучшению качества кода
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
 
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел Сычев
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.
 
Transpile it.pdf
Transpile it.pdfTranspile it.pdf
Transpile it.pdf
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
 
Decorators' recipes
Decorators' recipesDecorators' recipes
Decorators' recipes
 
Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей.
 

Теории и практики фунционального программирования - GDG D2D