Back to the future: Функциональное программирование вчера и сегодня
1. Tech Talks @NSU
Back to the Future:
ФП вчера и сегодня
Александр Гранин
graninas@gmail.com
2. План
Back to the Future:
Функциональное программирование вчера и сегодня
May the Force be with you:
Элементы ФП в мэйнстримных языках
There is no spoon:
Функциональная природа паттернов проектирования
An idea. Resilient. Highly contagious:
Новые идеи для enterprise
3. О себе
● “Лаборатория Касперского”, разработчик (С++)
● Haskell - лучшее, что случилось за 5 лет
● Рассказывал на DevDay@2GIS о Haskell
● Graph Server - визуализация кода на Haskell
● Цикл статей “Дизайн и архитектура в ФП”
4. “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?”
Back to the Future:
Brian Kernighan
Функциональное программирование
вчера и сегодня
5. Функциональное программирование
вчера
1958 - Lisp, Джон Маккарти
○ Язык сверхвысокого уровня
○ Функциональный, мультипарадигменный
○ Динамическая типизация
○ Сборка мусора
1964 - APL
1979 - ML
1985 - Miranda
...
7. Корректность програмной модели
и системы типизации
uint8_t sum (uint8_t x, uint8_t y)
{
return x + y; // Possible uint8_t overflow
}
data Nat = Z | S Nat
plus :: Nat -> Nat -> Nat
plus Z n = n
plus (S n) m = S (plus n m)
2 S (S Z)
3 S (S (S Z) )
2+3 S (S (S (S (S Z) ) ) )
10. Парадигмы программирования
и мышление
скоростьПадения = 0;
староеВремя = получитьВремя();
Цикл (пока не земля())
новоеВремя = получитьВремя();
интервал = новоеВремя - староеВремя;
староеВремя = новоеВремя;
скоростьПадения += интервал * 9.8;
Конец цикла
11. Функциональное программирование
и уровни абстракции
Техническая проблема
Мэйнстримный язык
ООП-идиомы +
императивщина
ОО-паттерн
Функциональный язык
Функциональная
Решение
идиома
12. Функциональное программирование
и уровни абстракции
Техническая проблема
ООП-идиомы +
императивщина
ОО-паттерн
Функциональный язык
Функциональная
Решение
идиома
Мэйнстримный язык
13. Функциональное программирование
и уровни абстракции
Техническая проблема
Функциональный
язык,
функциональные
идиомы
Мэйнстримный язык
ООП-идиомы +
императивщина
ОО-паттерн
Решение
15. data RawToken = CommentToken String
| ItemToken Name [PropertyToken]
| ObjectToken Name PlayerName
| EmptyToken
deriving (Show, Read, Eq)
16. “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
17. Лямбды и замыкания
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);
18. Первоклассные функции
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 );
19. Декларативно-функциональный код
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) == targetId
select matchResult;
22. “Any sufficiently complicated C or
Fortran program contains an ad-hoc,
There is no spoon:
informally-specified, bug-ridden,
slow implementation of
half of Common Lisp.”
Функциональная природа паттернов
проектирования
Philip Greenspun
24. Функциональная природа паттернов:
перед делом...
● ООП-языки были созданы, чтобы
придумывать паттерны проектирования.
● Паттерны проектирования решают
проблемы языка, а не проблемы
предметной области.
● Не хочешь учить Лисп? Тогда запили
свой ООП-язык.
25. Функциональная природа паттернов:
если серьезно...
● Многие ООП-паттерны реализуют
функциональный подход в ООП-мире.
● Паттерны естественным образом
выражаются идиомами ФП.
26. Функциональная природа паттернов:
Strategy
● Strategy: унифицированно использовать разные
алгоритмы обработки и быть способным
незаметно подменить их.
➢ В ФП: первоклассные
функции, функции
высших порядков,
лямбды
27. Функциональная природа паттернов:
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]
28. Функциональная природа паттернов:
Adapter, Decorator
● Adapter: адаптировать неподходящий
интерфейс
● Decorator: изменить поведение без изменения
интерфейса и имплементации
➢ В ФП: композиция функций,
функциональные
преобразования
34. Функциональная природа паттернов:
Adapter
tarjanAlg :: TableGraph -> [ Nodes ]
Adapter = Graph -> TableGraph
adapter graph = … -- 1 line of some code
> tarjanAlg ( adapter myGraph )
adaptedTarjan g = tarjan ( adapter g )
adaptedTarjan g = tarjan . adapter $ g
adaptedTarjan = tarjan . adapter
35. Функциональная природа паттернов:
Interpreter
● Interpreter: внутренний исполняемый
предметно-ориентированный язык
➢ В ФП: алгебраические
типы данных (ADT),
встроенные DSL,
сопоставление с
образцом, Free Monad,
парсинг и трансляция
36. Функциональная природа паттернов:
Visitor
● Visitor: обойти структуру данных с
выполнением какого-либо действия над ее
элементами.
➢ В ФП: сопоставление с
образцом, ФВП,
“свертка” структуры
(fold, reduce)
37. “A programming language is low
level when its programs require
attention to the irrelevant.”
An idea. Resilient. Highly contagious:
Новые идеи для enterprise
Alan J. Perlis
38. Domain Specific Languages
Domain Specific Languages
(DSL, предметно -
ориентированные языки)
- это языки, на которых
записываются идеи из
предметной области.
39. Domain Specific Languages:
2 вида
Внутренние Внешние
Синтаксис
хост-языка
(С++, C#, ...)
Произвольный
синтаксис
(в виде БНФ)
40. Domain Specific Languages:
трансляция в рабочий код
Внутренние Внешние
Уже являются
рабочим
кодом
Нужны парсер,
транслятор
42. Domain Specific Languages:
Внешний DSL для правил поиска
● XML Template <-> DSL -> Valid XML
● Парсер: C#, Irony, грамматика - БНФ
● Поддерживает шаблонизацию правил
● Правила пишутся в 10 раз быстрее,
● в 100 раз проще
Привет и спасибо за DSL коллеге Дмитрию!