Successfully reported this slideshow.
Your SlideShare is downloading. ×

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

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

Download to read offline

Лекция в рамках TechTalks @NSU о наиболее значимых идеях и принципах, которые пришли в enterprise из мира функционального программирования.

Лекция в рамках TechTalks @NSU о наиболее значимых идеях и принципах, которые пришли в enterprise из мира функционального программирования.

Advertisement
Advertisement

More Related Content

Advertisement

More from Alexander Granin

Advertisement

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

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

  1. 1. Tech Talks @NSU Back to the Future: ФП вчера и сегодня Александр Гранин graninas@gmail.com
  2. 2. План Back to the Future: Функциональное программирование вчера и сегодня May the Force be with you: Элементы ФП в мэйнстримных языках There is no spoon: Функциональная природа паттернов проектирования An idea. Resilient. Highly contagious: Новые идеи для enterprise
  3. 3. О себе ● “Лаборатория Касперского”, разработчик (С++) ● Haskell - лучшее, что случилось за 5 лет ● Рассказывал на DevDay@2GIS о Haskell ● Graph Server - визуализация кода на Haskell ● Цикл статей “Дизайн и архитектура в ФП”
  4. 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. 5. Функциональное программирование вчера 1958 - Lisp, Джон Маккарти ○ Язык сверхвысокого уровня ○ Функциональный, мультипарадигменный ○ Динамическая типизация ○ Сборка мусора 1964 - APL 1979 - ML 1985 - Miranda ...
  6. 6. Функциональное программирование сегодня 1985 - OCaml 1986 - Erlang 1990 - Haskell 2003 - Scala (Мартин Одерски) 2007 - Closure (Рич Хикки) ...
  7. 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) ) ) )
  8. 8. Побочные эффекты и чистота 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) ); }
  9. 9. Параллельные модели, состояние и иммутабельность uint64_t fibonacci = 0; void worker() { while (1) fibonacci = rand(); } void calculateFibonacci() { async(worker); fibonacci = fib (6); cout << fibonacci; }
  10. 10. Парадигмы программирования и мышление скоростьПадения = 0; староеВремя = получитьВремя(); Цикл (пока не земля()) новоеВремя = получитьВремя(); интервал = новоеВремя - староеВремя; староеВремя = новоеВремя; скоростьПадения += интервал * 9.8; Конец цикла
  11. 11. Функциональное программирование и уровни абстракции Техническая проблема Мэйнстримный язык ООП-идиомы + императивщина ОО-паттерн Функциональный язык Функциональная Решение идиома
  12. 12. Функциональное программирование и уровни абстракции Техническая проблема ООП-идиомы + императивщина ОО-паттерн Функциональный язык Функциональная Решение идиома Мэйнстримный язык
  13. 13. Функциональное программирование и уровни абстракции Техническая проблема Функциональный язык, функциональные идиомы Мэйнстримный язык ООП-идиомы + императивщина ОО-паттерн Решение
  14. 14. Математическая база и главенство идеи
  15. 15. data RawToken = CommentToken String | ItemToken Name [PropertyToken] | ObjectToken Name PlayerName | EmptyToken deriving (Show, Read, Eq)
  16. 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. 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. 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. 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;
  20. 20. Отложенные вычисления (ленивость) Здесь ничего не будет. Мне лениво,
  21. 21. Отложенные вычисления (ленивость) Здесь ничего не будет. Мне лениво, а вам не понадобится.
  22. 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
  23. 23. Функциональная природа паттернов: перед делом... Зачем были созданы ООП-языки (Java, C++, C#, etc.)?
  24. 24. Функциональная природа паттернов: перед делом... ● ООП-языки были созданы, чтобы придумывать паттерны проектирования. ● Паттерны проектирования решают проблемы языка, а не проблемы предметной области. ● Не хочешь учить Лисп? Тогда запили свой ООП-язык.
  25. 25. Функциональная природа паттернов: если серьезно... ● Многие ООП-паттерны реализуют функциональный подход в ООП-мире. ● Паттерны естественным образом выражаются идиомами ФП.
  26. 26. Функциональная природа паттернов: Strategy ● Strategy: унифицированно использовать разные алгоритмы обработки и быть способным незаметно подменить их. ➢ В ФП: первоклассные функции, функции высших порядков, лямбды
  27. 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. 28. Функциональная природа паттернов: Adapter, Decorator ● Adapter: адаптировать неподходящий интерфейс ● Decorator: изменить поведение без изменения интерфейса и имплементации ➢ В ФП: композиция функций, функциональные преобразования
  29. 29. Функциональная природа паттернов: Adapter B -> Result A; ?
  30. 30. Функциональная природа паттернов: Adapter ! Adapter! B -> Result A; A -> B A -> (A -> B) -> Result
  31. 31. Функциональная природа паттернов: Adapter tarjanAlg :: TableGraph -> [ Nodes ] 1 2 3 Graph = Node -> Nodes 1 → 2, 3 2 → ∅ 3 → 1, 2 myGraph :: Graph =
  32. 32. Функциональная природа паттернов: Adapter tarjanAlg :: TableGraph -> [ Nodes ] Adapter = Graph -> TableGraph adapter graph = … -- 1 line of some code Graph = Node -> Nodes 1 2 3 1 → 2, 3 2 → ∅ 3 → 1, 2 myGraph :: Graph =
  33. 33. Функциональная природа паттернов: Adapter tarjanAlg :: TableGraph -> [ Nodes ] Adapter = Graph -> TableGraph adapter graph = … -- 1 line of some code > tarjanAlg ( adapter myGraph ) 1 2 3
  34. 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. 35. Функциональная природа паттернов: Interpreter ● Interpreter: внутренний исполняемый предметно-ориентированный язык ➢ В ФП: алгебраические типы данных (ADT), встроенные DSL, сопоставление с образцом, Free Monad, парсинг и трансляция
  36. 36. Функциональная природа паттернов: Visitor ● Visitor: обойти структуру данных с выполнением какого-либо действия над ее элементами. ➢ В ФП: сопоставление с образцом, ФВП, “свертка” структуры (fold, reduce)
  37. 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. 38. Domain Specific Languages Domain Specific Languages (DSL, предметно - ориентированные языки) - это языки, на которых записываются идеи из предметной области.
  39. 39. Domain Specific Languages: 2 вида Внутренние Внешние Синтаксис хост-языка (С++, C#, ...) Произвольный синтаксис (в виде БНФ)
  40. 40. Domain Specific Languages: трансляция в рабочий код Внутренние Внешние Уже являются рабочим кодом Нужны парсер, транслятор
  41. 41. Domain Specific Languages: Внешний DSL для правил поиска
  42. 42. Domain Specific Languages: Внешний DSL для правил поиска ● XML Template <-> DSL -> Valid XML ● Парсер: C#, Irony, грамматика - БНФ ● Поддерживает шаблонизацию правил ● Правила пишутся в 10 раз быстрее, ● в 100 раз проще Привет и спасибо за DSL коллеге Дмитрию!
  43. 43. Domain Specific Combinators Name Description String Pure Body Type Body Guarded Body Integer Token
  44. 44. Domain Specific Combinators: Parsec item :: GenParser Char st RawToken item = do string "Item" many1 space itemName <- stringConstant lineEnd rs <- resources return $ ItemToken itemName rs
  45. 45. Functional Reactive Programming Классическая событийная модель Event A Handler 1 Event B Handler 2 Event C Handler 3 Состояние
  46. 46. Functional Reactive Programming Action 1 Action 2 ... A A B C D C (B, C) B Состояние Legend A Signal Hold Zip Change Merge Время
  47. 47. Functional Reactive Programming
  48. 48. Functional Reactive Programming
  49. 49. Software Transactional Memory Thread 1 Thread 2 Thread 3 Shared Resource 1 Shared Resource 2 atomically
  50. 50. Tech Talks @NSU Спасибо за внимание! Александр Гранин graninas@gmail.com

×