SlideShare a Scribd company logo
Процедурный
Объектно-ориентированный
Стили программирования:
Функциональное программирование
(Functional programming)
λ
λ
λ λ
теория категорий- исчисление
Основы
λ
Чистые функции
Функции высшего
порядка
Неизменяемость
Каррирование Рекурсия Композиция функций
Алгебраические
типы данных
Pattern matching
Специализированные
функции
Функторы
Параметрический
полиморфизм
Монады
λ
x = x + 1
Основы
x = y + 1 👍
🤔
Языкиλ
Чистые
(pure)
Haskell
Elm
…
В первую очередь
(functional first)
Scala
F#
OCaml
…
С возможностями
Java
C#
C7++
JavaScript
…
λ Чистые функции (pure functions)
f(x)
1
2
3
4
5
6
1
1
2
3
5
8
Чистые функции (pure functions)
λ
f(x)
1
2
3
4
5
6
1
1
2
3
5
8
Чистые функции (pure functions)
λ
Побочные эффекты
•Запись в файл
•Чтение из файла
•Запрос к базе данных
•Глобальные переменные
•console.log(‘Hello’)
77...
Чистые функции (pure functions)
λ
var pushed = push100(
var array = [1, 2, 3];
function push100(
);
) {
return array;
array.push(100);
E//[1, 2, 3, 100]
E//[1, 2, 3, 100, 100]
}
Чистые функции (pure functions)
λ
var pushed = push100(
function push100(
);
) {
array.push(100);
array
[1, 2, 3]
return array;
}
E//[1, 2, 3, 100]
E//[1, 2, 3, 100]
Чистые функции (pure functions)
λ
var pushed = push100(
function push100(
);
) {
array.push(100);
array
[1, 2, 3]
return array;
}
console.log('Pushing to arrayEE...');
Чистые функции (pure functions)
λ
var pushed = push100(
function push100(
);
) {
array.push(100);
array
[1, 2, 3]
return array;
}
saveToDatabase(array);
Чистые функции (pure functions)
λ
var pushed = push100(
function push100(
);
) {
array.push(100);
array
[1, 2, 3]
return array;
}
launch(🚀🚀🚀🚀);
λ Функции высшего порядка (higher-order)
•Функции обычные значения
•Функции принимают функции
•Функции возвращают функции
•Абстракция над действием
•Callbacks, promises
•Filter, map, reduce
•Похоже на DI в OOP
λ Функции высшего порядка (higher-order)
function delay5(launch) {
setTimeout(function() {
launch();
}, 5000);
}
delay5(function() {
console.log("Launching 🚀🚀🚀🚀");
});
E// Через 5 секунд
E// Launching 🚀🚀🚀🚀
λ Каррирование (curring)
•Преобразует функцию с
несколькими аргументами, в
функцию с меньшим количеством
аргументов
•Создает функции с
“предзаполненными” аргументами
•Rambda.js
λ Каррирование (curring)
var logo = function(main) {
return function(second) {
console.log("Logo is: ".concat(main, " and ", second));
}
}
var bearLogo = logo(“🐻”);
var bearAndBeerLogo = bearLogo(“🍺");
E// Logo is: 🐻 and 🍺
var bearAndRocketLogo = bearLogo("🚀");
E// Logo is: 🐻 and 🚀
λ Неизменяемость (immutability)
•Значения не меняется после
создания
•Убирает скрытые зависимости
•String, Number
•Для остального Immutable.js
λ Рекурсия (recursion)
•Функция вызывает сама себя
•Проверяется условие для выхода
•Нет побочных эффектов
•Локальные переменные не
изменяются
•Оптимизация часть стандарта, но
реализованные еще нет на всех
платформах
λ Рекурсия (recursion)
var countdown = function(i) {
if (i E<= 0) {
console.log("Launching 🚀🚀🚀🚀");
return i;
}
console.log(i + "EE...")
return countdown(i - 1);
}
countdown(3)
E// 3EE...
E// 2EE...
E// 1EE...
E// Launching 🚀🚀🚀🚀
λ Специализированные функции
•Filter, map, reduce
•Нет побочных эффектов
•Лучше читаемость
λ Специализированные функции
var count = drinks.filter(elem E=> elem E!= “🍷")
var drinks = ["🍺", "🍻", "🍻", "🍺", “🍷"]
E// ["🍺", "🍻", "🍻", "🍺"]
.map ( elem E=> elem EE=== "🍻" ? 2 : 1 )
.reduce((result, elem) E=> result + elem, 0)
E// [1, 2, 2, 1]
E// 6
λ Что с этим делать ?
Императивная
оболочка
Функциональное
ядро
λ С чего начать ?
JavaScript
Разделить вычисления
и побочные эффекты
Заменить все циклы на
filter, map и reduce
Библиотеки
Ramda
Immutable.js
Lodash
Underscore.js
Типизация
Flow
Транскомпиляция
С типами Без типов
ClojureScript
TypeScript
Elm
ReasonML
PureScript
Сложностиλ
•Другая парадигма, нужно время
чтобы привыкнуть
•Много библиотек, плохое
взаимодействие
•Примеры и документация часто в
императивном стиле
Вопросы ?
λ
λ λ
λ

More Related Content

What's hot

Subprograms in VHDL, Functions in VHDL
Subprograms in VHDL, Functions in VHDLSubprograms in VHDL, Functions in VHDL
Subprograms in VHDL, Functions in VHDL
vitaliykulanov
 
стандартная библиотека с++: введение
стандартная библиотека с++: введениестандартная библиотека с++: введение
стандартная библиотека с++: введение
mcroitor
 
алгоритмы stl
алгоритмы stlалгоритмы stl
алгоритмы stl
mcroitor
 
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)
Ontico
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli typesmcroitor
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
mcroitor
 
PHP7 - Предрелизный обзор
PHP7 - Предрелизный обзорPHP7 - Предрелизный обзор
PHP7 - Предрелизный обзор
Grossum
 
1 Презентация функциональное программирование
1 Презентация функциональное программирование1 Презентация функциональное программирование
1 Презентация функциональное программирование
STEP Computer Academy (Zaporozhye)
 
JPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчикаJPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчикаAnton Arhipov
 
fp intro
fp introfp intro
fp intro
Ivan Glushkov
 
Всё ли ты знаешь о JavaScript ООП?
Всё ли ты знаешь о JavaScript ООП?Всё ли ты знаешь о JavaScript ООП?
Всё ли ты знаешь о JavaScript ООП?
Vitaly Hornik
 
Structural project description in VHDL
Structural project description in VHDLStructural project description in VHDL
Structural project description in VHDL
vitaliykulanov
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORM
Badoo Development
 
контейнеры STL
контейнеры STLконтейнеры STL
контейнеры STL
mcroitor
 
Введение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКА
Введение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКАВведение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКА
Введение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКА
Igor Kleiner
 
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
vitaliykulanov
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
Ontico
 
практика 4
практика 4практика 4
практика 4student_kai
 
Reactive extensions
Reactive extensionsReactive extensions
Reactive extensions
Sergey Teplyakov
 

What's hot (20)

Subprograms in VHDL, Functions in VHDL
Subprograms in VHDL, Functions in VHDLSubprograms in VHDL, Functions in VHDL
Subprograms in VHDL, Functions in VHDL
 
стандартная библиотека с++: введение
стандартная библиотека с++: введениестандартная библиотека с++: введение
стандартная библиотека с++: введение
 
алгоритмы stl
алгоритмы stlалгоритмы stl
алгоритмы stl
 
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli types
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
 
Кратко о Mac OS X
Кратко о Mac OS XКратко о Mac OS X
Кратко о Mac OS X
 
PHP7 - Предрелизный обзор
PHP7 - Предрелизный обзорPHP7 - Предрелизный обзор
PHP7 - Предрелизный обзор
 
1 Презентация функциональное программирование
1 Презентация функциональное программирование1 Презентация функциональное программирование
1 Презентация функциональное программирование
 
JPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчикаJPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчика
 
fp intro
fp introfp intro
fp intro
 
Всё ли ты знаешь о JavaScript ООП?
Всё ли ты знаешь о JavaScript ООП?Всё ли ты знаешь о JavaScript ООП?
Всё ли ты знаешь о JavaScript ООП?
 
Structural project description in VHDL
Structural project description in VHDLStructural project description in VHDL
Structural project description in VHDL
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORM
 
контейнеры STL
контейнеры STLконтейнеры STL
контейнеры STL
 
Введение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКА
Введение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКАВведение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКА
Введение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКА
 
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 
практика 4
практика 4практика 4
практика 4
 
Reactive extensions
Reactive extensionsReactive extensions
Reactive extensions
 

Similar to Functional

2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure
Омские ИТ-субботники
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
Alex Ott
 
Clojure – есть ли жизнь после Java
Clojure – есть ли жизнь после JavaClojure – есть ли жизнь после Java
Clojure – есть ли жизнь после Java
Olim Saidov
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Yandex
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
Alexander Granin
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
Igor Shkulipa
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
Denis Efremov
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
Positive Hack Days
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
Positive Development User Group
 
ОПК № 2 – Алгоритмы и структуры данных, язык C
ОПК № 2 – Алгоритмы и структуры данных, язык CОПК № 2 – Алгоритмы и структуры данных, язык C
ОПК № 2 – Алгоритмы и структуры данных, язык C
Vladimir Parfinenko
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
Anton Kirillov
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
Yuri Trukhin
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
solit
 
Some Elements of Functional Porgamming Languages
Some Elements of Functional Porgamming LanguagesSome Elements of Functional Porgamming Languages
Some Elements of Functional Porgamming Languages_ymn
 
Инструментация среды исполнения в арсенале тестировщика
Инструментация среды исполнения в арсенале тестировщикаИнструментация среды исполнения в арсенале тестировщика
Инструментация среды исполнения в арсенале тестировщика
SQALab
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
OdessaFrontend
 

Similar to Functional (20)

2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Clojure – есть ли жизнь после Java
Clojure – есть ли жизнь после JavaClojure – есть ли жизнь после Java
Clojure – есть ли жизнь после Java
 
Scala: introduction
Scala: introductionScala: introduction
Scala: introduction
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
ОПК № 2 – Алгоритмы и структуры данных, язык C
ОПК № 2 – Алгоритмы и структуры данных, язык CОПК № 2 – Алгоритмы и структуры данных, язык C
ОПК № 2 – Алгоритмы и структуры данных, язык C
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
 
Some Elements of Functional Porgamming Languages
Some Elements of Functional Porgamming LanguagesSome Elements of Functional Porgamming Languages
Some Elements of Functional Porgamming Languages
 
Инструментация среды исполнения в арсенале тестировщика
Инструментация среды исполнения в арсенале тестировщикаИнструментация среды исполнения в арсенале тестировщика
Инструментация среды исполнения в арсенале тестировщика
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
 

More from Andrey Volobuev

Prompt engineering for iOS developers (How LLMs and GenAI work)
Prompt engineering for iOS developers (How LLMs and GenAI work)Prompt engineering for iOS developers (How LLMs and GenAI work)
Prompt engineering for iOS developers (How LLMs and GenAI work)
Andrey Volobuev
 
Protocols and generics in Swift
Protocols and generics in SwiftProtocols and generics in Swift
Protocols and generics in Swift
Andrey Volobuev
 
State machines in iOS
State machines in iOSState machines in iOS
State machines in iOS
Andrey Volobuev
 
ML
MLML
Mobile architectures
Mobile architecturesMobile architectures
Mobile architectures
Andrey Volobuev
 
How React works
How React works How React works
How React works
Andrey Volobuev
 
Unit testing iOS Applications
Unit testing iOS ApplicationsUnit testing iOS Applications
Unit testing iOS Applications
Andrey Volobuev
 
Архитектура компилятора Swift
Архитектура компилятора SwiftАрхитектура компилятора Swift
Архитектура компилятора Swift
Andrey Volobuev
 
Преимущества и недостатки языка Swift
Преимущества и недостатки языка SwiftПреимущества и недостатки языка Swift
Преимущества и недостатки языка Swift
Andrey Volobuev
 

More from Andrey Volobuev (9)

Prompt engineering for iOS developers (How LLMs and GenAI work)
Prompt engineering for iOS developers (How LLMs and GenAI work)Prompt engineering for iOS developers (How LLMs and GenAI work)
Prompt engineering for iOS developers (How LLMs and GenAI work)
 
Protocols and generics in Swift
Protocols and generics in SwiftProtocols and generics in Swift
Protocols and generics in Swift
 
State machines in iOS
State machines in iOSState machines in iOS
State machines in iOS
 
ML
MLML
ML
 
Mobile architectures
Mobile architecturesMobile architectures
Mobile architectures
 
How React works
How React works How React works
How React works
 
Unit testing iOS Applications
Unit testing iOS ApplicationsUnit testing iOS Applications
Unit testing iOS Applications
 
Архитектура компилятора Swift
Архитектура компилятора SwiftАрхитектура компилятора Swift
Архитектура компилятора Swift
 
Преимущества и недостатки языка Swift
Преимущества и недостатки языка SwiftПреимущества и недостатки языка Swift
Преимущества и недостатки языка Swift
 

Functional