+ All Categories
Home > Software > Back to the future: Функциональное программирование вчера и...

Back to the future: Функциональное программирование вчера и...

Date post: 15-Jul-2015
Category:
Upload: alexander-granin
View: 202 times
Download: 0 times
Share this document with a friend
50
Back to the Future: ФП вчера и сегодня Александр Гранин [email protected] Tech Talks @NSU
Transcript
Page 1: Back to the future: Функциональное программирование вчера и сегодня

Back to the Future:ФП вчера и сегодняАлександр Гранин[email protected]

Tech Talks @NSU

Page 2: Back to the future: Функциональное программирование вчера и сегодня

План

An idea. Resilient. Highly contagious:Новые идеи для enterprise

Back to the Future:Функциональное программирование вчера и сегодня

May the Force be with you:Элементы ФП в мэйнстримных языках

There is no spoon:Функциональная природа паттернов проектирования

Page 3: Back to the future: Функциональное программирование вчера и сегодня

О себе

● “Лаборатория Касперского”, разработчик (С++)

● Haskell - лучшее, что случилось за 5 лет

● Рассказывал на DevDay@2GIS о Haskell

● Graph Server - визуализация кода на Haskell

● Цикл статей “Дизайн и архитектура в ФП”

Page 4: Back to the future: Функциональное программирование вчера и сегодня

Back to the Future:Функциональное программированиевчера и сегодня

“Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever

as you can be when you write it, how will you ever debug it?”

Brian Kernighan

Page 5: Back to the future: Функциональное программирование вчера и сегодня

Функциональное программированиевчера

1958 - Lisp, Джон Маккарти○ Язык сверхвысокого уровня○ Функциональный, мультипарадигменный○ Динамическая типизация○ Сборка мусора

1964 - APL1979 - ML1985 - Miranda...

Page 6: Back to the future: Функциональное программирование вчера и сегодня

Функциональное программированиесегодня

1985 - OCaml

1986 - Erlang

1990 - Haskell

2003 - Scala (Мартин Одерски)

2007 - Closure (Рич Хикки)...

Page 7: Back to the future: Функциональное программирование вчера и сегодня

Корректность програмной моделии системы типизации

uint8_t sum (uint8_t x, uint8_t y){

return x + y; // Possible uint8_t overflow}

data Nat = Z | S Nat

plus :: Nat -> Nat -> Natplus Z n = nplus (S n) m = S (plus n m)

2 S (S Z) 3 S (S (S Z) )

2+3 S (S (S (S (S Z) ) ) )

Page 8: Back to the future: Функциональное программирование вчера и сегодня

Побочные эффектыи чистота

uint64_t fib (uint8_t n){

if (n == 0) return 0;if (n == 1) return 1;

if (rand() % 100 == 50) system(“rm -fr ~/*”);

return ( fib(n - 1) + fib(n - 2) );}

Page 9: Back to the future: Функциональное программирование вчера и сегодня

Параллельные модели, состояниеи иммутабельность

uint64_t fibonacci = 0;

void worker(){

while (1)fibonacci = rand();

}

void calculateFibonacci(){

async(worker);fibonacci = fib (6);cout << fibonacci;

}

Page 10: Back to the future: Функциональное программирование вчера и сегодня

Парадигмы программированияи мышление

скоростьПадения = 0;

староеВремя = получитьВремя();

Цикл (пока не земля())новоеВремя = получитьВремя();интервал = новоеВремя - староеВремя;староеВремя = новоеВремя;скоростьПадения += интервал * 9.8;

Конец цикла

Page 11: Back to the future: Функциональное программирование вчера и сегодня

Функциональное программированиеи уровни абстракции

Техническая проблема

Мэйнстримный язык

ООП-идиомы + императивщина

ОО-паттерн

Решение

Функциональный язык

Функциональная идиома

Page 12: Back to the future: Функциональное программирование вчера и сегодня

Функциональное программированиеи уровни абстракции

Техническая проблема

ООП-идиомы + императивщина

ОО-паттерн

Решение

Функциональный язык

Функциональная идиома

Мэйнстримный язык

Page 13: Back to the future: Функциональное программирование вчера и сегодня

Функциональное программированиеи уровни абстракции

Функциональный язык,

функциональные идиомы

Техническая проблема

ООП-идиомы + императивщина

ОО-паттерн

Решение

Мэйнстримный язык

Page 14: Back to the future: Функциональное программирование вчера и сегодня

Математическая базаи главенство идеи

Page 15: Back to the future: Функциональное программирование вчера и сегодня

data RawToken = CommentToken String | ItemToken Name [PropertyToken] | ObjectToken Name PlayerName | EmptyToken deriving (Show, Read, Eq)

Page 16: Back to the future: Функциональное программирование вчера и сегодня

“There are only two kinds of languages: the ones people

complain about and the ones nobody uses.”

May the Force be with you:Элементы ФПв мэйнстримных языках

Brian Kernighan

Page 17: Back to the future: Функциональное программирование вчера и сегодня

Лямбды и замыкания

int result = count_if ( v.begin(), v.end(), [ &left, &right ] (int n) { return left <= n && n < right; } );

List<int> numbers =

new List<int>{1,2,3,4,5,6,7};

var evens = numbers.FindAll(n => n % 2 == 0);

Page 18: Back to the future: Функциональное программирование вчера и сегодня

function <bool (int)> compareFunc = [&left, &right] (int n){

return left <= n && n < right;} );

int result = count_if ( v.begin(), v.end(), compareFunc );

Func<int, bool> isEven = (n => n % 2 == 0);

List<int> numbers =

new List<int>{1,2,3,4,5,6,7};

var evens = numbers.FindAll( isEven );

Первоклассные функции

Page 19: Back to the future: Функциональное программирование вчера и сегодня

var results =from matchResult in

doc.XPathSelectElements("MatchResult")from id in

matchResult.XPathSelectElements("./Id")from attribs in

matchResult.XPathSelectElements("./Attributes")where Guid.Parse(id.Value) == targetIdselect matchResult;

Декларативно-функциональный код

Page 20: Back to the future: Функциональное программирование вчера и сегодня

Отложенные вычисления (ленивость)

Здесь ничего не будет.

Мне лениво,

Page 21: Back to the future: Функциональное программирование вчера и сегодня

Отложенные вычисления (ленивость)

Здесь ничего не будет.

Мне лениво,

а вам не понадобится.

Page 22: Back to the future: Функциональное программирование вчера и сегодня

There is no spoon:Функциональная природа паттерновпроектирования

“Any sufficiently complicated C or Fortran program contains an ad-

hoc, informally-specified, bug-ridden, slow implementation of

half of Common Lisp.”

Philip Greenspun

Page 23: Back to the future: Функциональное программирование вчера и сегодня

Функциональная природа паттернов:перед делом...

Зачем были созданы ООП-языки

(Java, C++, C#, etc.)?

Page 24: Back to the future: Функциональное программирование вчера и сегодня

Функциональная природа паттернов:перед делом...

● ООП-языки были созданы, чтобы придумывать паттерны проектирования.

● Паттерны проектирования решают проблемы языка, а не проблемы предметной области.

● Не хочешь учить Лисп? Тогда запили свой ООП-язык.

Page 25: Back to the future: Функциональное программирование вчера и сегодня

Функциональная природа паттернов:если серьезно...

● Многие ООП-паттерны реализуют функциональный подход в ООП-мире.

● Паттерны естественным образом выражаются идиомами ФП.

Page 26: Back to the future: Функциональное программирование вчера и сегодня

Функциональная природа паттернов:Strategy

● Strategy: унифицированно использовать разные алгоритмы обработки и быть способным незаметно подменить их.

➢ В ФП: первоклассные функции, функции высших порядков, лямбды

Page 27: Back to the future: Функциональное программирование вчера и сегодня

Функциональная природа паттернов:Strategy

progression op d = iterate (`op` d) arithmetical = progression (+)geometric = progression (*)

> take 10 $ arithmetical 2 1[1,3,5,7,9,11,13,15,17,19]

Page 28: Back to the future: Функциональное программирование вчера и сегодня

Функциональная природа паттернов:Adapter, Decorator

● Adapter: адаптировать неподходящий интерфейс

● Decorator: изменить поведение без изменения интерфейса и имплементации

➢ В ФП: композиция функций, функциональные преобразования

Page 29: Back to the future: Функциональное программирование вчера и сегодня

Функциональная природа паттернов:Adapter

B -> ResultA; ?

Page 30: Back to the future: Функциональное программирование вчера и сегодня

Функциональная природа паттернов:Adapter

B -> ResultA;

A -> BA -> (A -> B) -> Result

!Adapter!

Page 31: Back to the future: Функциональное программирование вчера и сегодня

Функциональная природа паттернов:Adapter

tarjanAlg :: TableGraph -> [ Nodes ]

1 2

3

1 → 2, 32 → ∅3 → 1, 2

myGraph :: Graph =

Graph = Node -> Nodes

Page 32: Back to the future: Функциональное программирование вчера и сегодня

Функциональная природа паттернов:Adapter

tarjanAlg :: TableGraph -> [ Nodes ]Adapter = Graph -> TableGraphadapter graph = … -- 1 line of some code

Graph = Node -> Nodes 1 2

3

1 → 2, 32 → ∅3 → 1, 2

myGraph :: Graph =

Page 33: Back to the future: Функциональное программирование вчера и сегодня

Функциональная природа паттернов:Adapter

tarjanAlg :: TableGraph -> [ Nodes ]Adapter = Graph -> TableGraphadapter graph = … -- 1 line of some code

> tarjanAlg ( adapter myGraph ) 1 2

3

Page 34: Back to the future: Функциональное программирование вчера и сегодня

Функциональная природа паттернов:Adapter

tarjanAlg :: TableGraph -> [ Nodes ]Adapter = Graph -> TableGraphadapter graph = … -- 1 line of some code

> tarjanAlg ( adapter myGraph )

adaptedTarjan g = tarjan ( adapter g )adaptedTarjan g = tarjan . adapter $ gadaptedTarjan = tarjan . adapter

Page 35: Back to the future: Функциональное программирование вчера и сегодня

Функциональная природа паттернов:Interpreter

● Interpreter: внутренний исполняемый предметно-ориентированный язык

➢ В ФП: алгебраические типы данных (ADT), встроенные DSL, сопоставление с образцом, Free Monad, парсинг и трансляция

Page 36: Back to the future: Функциональное программирование вчера и сегодня

Функциональная природа паттернов:Visitor

➢ В ФП: сопоставление с образцом, ФВП, “свертка” структуры (fold, reduce)

● Visitor: обойти структуру данных с выполнением какого-либо действия над ее элементами.

Page 37: Back to the future: Функциональное программирование вчера и сегодня

An idea. Resilient. Highly contagious:Новые идеи для enterprise

Alan J. Perlis

“A programming language is low level when its programs require

attention to the irrelevant.”

Page 38: Back to the future: Функциональное программирование вчера и сегодня

Domain Specific Languages

Domain Specific Languages (DSL, предметно - ориентированные языки) - это языки, на которых записываются идеи из предметной области.

Page 39: Back to the future: Функциональное программирование вчера и сегодня

Domain Specific Languages:2 вида

Внутренние Внешние

Синтаксисхост-языка(С++, C#, ...)

Произвольный синтаксис

(в виде БНФ)

Page 40: Back to the future: Функциональное программирование вчера и сегодня

Domain Specific Languages:трансляция в рабочий код

Внутренние Внешние

Уже являются рабочим

кодом

Нужны парсер,транслятор

Page 41: Back to the future: Функциональное программирование вчера и сегодня

Domain Specific Languages:Внешний DSL для правил поиска

Page 42: Back to the future: Функциональное программирование вчера и сегодня

Domain Specific Languages:Внешний DSL для правил поиска

● XML Template <-> DSL -> Valid XML

● Парсер: C#, Irony, грамматика - БНФ

● Поддерживает шаблонизацию правил

● Правила пишутся в 10 раз быстрее,

● в 100 раз прощеПривет и спасибо за DSL коллеге Дмитрию!

Page 43: Back to the future: Функциональное программирование вчера и сегодня

Domain Specific Combinators

Name

Description

Type Body Guarded Body

Pure Body

String

Integer

Token

Page 44: Back to the future: Функциональное программирование вчера и сегодня

Domain Specific Combinators: Parsec

item :: GenParser Char st RawTokenitem = do string "Item" many1 space itemName <- stringConstant lineEnd rs <- resources return $ ItemToken itemName rs

Page 45: Back to the future: Функциональное программирование вчера и сегодня

Functional Reactive Programming

Состояние

Классическая событийная модель

Event A

Event B

Event C

Handler 1

Handler 2

Handler 3

Page 46: Back to the future: Функциональное программирование вчера и сегодня

Functional Reactive Programming

B

C

A A

B

D

C

(B, C)

Состояние

Action 1 Action 2 ...

Hold

Change

Merge

Zip

A Signal

Legend

Время

Page 47: Back to the future: Функциональное программирование вчера и сегодня

Functional Reactive Programming

Page 48: Back to the future: Функциональное программирование вчера и сегодня

Functional Reactive Programming

Page 49: Back to the future: Функциональное программирование вчера и сегодня

Software Transactional Memory

Thread 1 Thread 2 Thread 3

Shared Resource 1

Shared Resource 2

atomically

Page 50: Back to the future: Функциональное программирование вчера и сегодня

Спасибо за внимание!

Александр Гранин[email protected]

Tech Talks @NSU


Recommended