SlideShare a Scribd company logo
λ
ФП появилось раньше ООП и структурного
программирования
LISP 1958
Закон Мура 1965
Simula 1967
Структурное программирование 1970
ML 1973
С++ 1983
Ocaml 1985
Erlang 1987
Haskell 1990
Scala 2003
F# 2005
Clojure 2007
Elm 2012
More than Moore 2014
Но не получило распространения в индустрии
из-за дороговизны памяти на заре computer
science, хотя и нашло свое место в научных
кругах
Интерес вернулся в последние 5 лет
• Закон Мура «выдыхается»
• Популярность облачных
решений растет
• Big Data, машинное обучение,
боты, когнитивные сервисы
LISP
• Появился в 1958 году
• Создатель Лиспа Джон Маккарти занимался исследованиями в
области искусственного интеллекта (в дальнейшем ИИ) и
созданный им язык по сию пору является одним из основных
средств моделирования различных аспектов ИИ
• Это один из старейших (наряду с Фортраном и Коболом)
используемых по сей день высокоуровневых языков
программирования
• Основой архитектуры его является лямбда-исчисление
• Интерпретатор Лиспа, написанный на Лиспе, занимает 15 строк
Что не так с состоянием?
• Locking, Memory Bandwidth
• How To Reproduce / Debug
• Race Conditions
• Side Effects
• Не возможно доказать корректность программы
Чему равен y?
var x = 2;
DoSomething(x);
// чему равен y?
var y = x - 1;
Ответ
-1
Это JavaScript 
function DoSomething (foo) { x = false }
var x = 2;
DoSomething(x);
var y = x - 1;
Функциональное программиирование
• Раздел дискретной математики
и парадигма
программирования, в которой
процесс вычисления трактуется
как вычисление значений
функций в математическом
понимании последних
• Понимание функции отличается
от функции как подпрограммы
в процедурном
программировании
Функция –
Соответствие между элементами двух множеств, установленное по
такому правилу, что каждому элементу одного множества ставится
в соответствие некоторый элемент из другого множества.
Принцип разделения интерфейса
Принцип разделения интерфейсов говорит о том, что слишком
«толстые» интерфейсы необходимо разделять на более маленькие
и специфические, чтобы клиенты маленьких
public interface IMessyCalc
{
float Add(float a, float b);
Rocket LaunchRocket(); // WAT?
}
Принцип разделения интерфейса
public interface ICalc
{
float Add(float a, float b);
}
public interface IRocketLauncher
{
Rocket LaunchRocket(); // ok
}
ICalc проще
let add x y = x + y; // float -> float -> float
Функции и вывод типов
let add1 x = x + 1 // int -> int
let add2 x = x + 2 // int -> int
let add3C = add1 >> add2 //композиция
let add3P x = x |> add1 |> add2 // pipe-оператор
let toString x = x.ToString() // 'a -> string
Аналогия с конвеерной лентой
Композиция
Композиция
Каррирование и частичное применение
let printTwoParameters x y =
printfn "x=%i y=%i" x y
//explicitly curried version
let printTwoParametersC x = // only one parameter!
let subFunction y =
printfn "x=%i y=%i" x y // new function with one param
subFunction
let add x y = x + y
let add1P = add 1
let v = add1P 2
let result =
[1..10]
|> List.map (fun i -> i+1)
|> List.filter (fun i -> i>5)
Изменяемые данные (не тру)
let mutable mut = 5
mut <- 6
React/Redux Demo
λ-исчисление
• Формальная система, разработанная американским математиком
Алонзо Чёрчем, для формализации и анализа понятия
вычислимости
• Строится на простых двух операциях: аппликации и абстракции
• Определены фундаментальные понятия α-эквивалентностью и β-
редукции
• Многие функциональные языки можно рассматривать как
"надстройку" над ними
λ-исчисление
• Нет циклов
• Нет переменных
• Нет операции присвоения
• Нет изменяемого состояния
• Нет условных переходов и циклов
• Нет «обычной» рекурсии
• Обладает свойством полноты по
Тьюрингу и, следовательно,
представляет собой простейший язык
программирования
Теорема о неподвижной точке
• И в λ-исчислении, и в комбинаторной логике для каждого терма X
существует по крайней мере один терм P такой, что XP = P. И
более того, существует комбинатор Y такой, что YX = X(YX)
• Комбинатор неподвижной точки преобразует нерекурсивную
функцию, вычисляющую один шаг рекурсии, в рекурсивную
• Y = λf.(λx.f(xx))(λx.f(xx))
• Z = λf.(λx.f(λy.xxy))(λx.f(λy.xxy))
• https://habrahabr.ru/post/79713/
α-эквивалентность
• λx.x и λy.y альфа-эквивалентные лямбда-термы и оба
представляют одну и ту же функцию (функцию тождества).
• Термы x и y не альфа-эквивалентны, так как они не находятся в
лямбда абстракции
β-редукция
•(λx.2 * x + 1)3 -> 7
Структурирование программ
Expressions VS Statements
Expression<Func<int, string>> expr = x =>
{
return x.ToString();
};
CS0834 A lambda expression with a statement body cannot be
converted to an expression tree
Statement
var str = "test";
var i = 1;
if (flag)
{
str += i;
}
else
{
i++;
}
Expression
var fiveOrSix = Math.Cos(1) > 0 ? 5 : 6;
Fixed
Expression<Func<int, string>> expr = x => x.ToString(); // ok
Что возвращает функция?
function DoSomething (foo) {
if (foo > 5) return 2;
throw "Error";
}
var x = 2;
DoSomething(x);
var y = x - 1;
Exception Handling Considered Harmful
• Hidden Control Flow & Corrupt State
• Mismatch With Parallel Programming
• Exceptional Exceptions
• Exceptions only really work reliably when nobody
catches them
do
{
using (var lifetimeScope = _container.BeginLifetimeScope())
{
var billingService = lifetimeScope.Resolve<BillingService>();
try
{
int activityCount = billingService.ProcessNotRatedActivities();
if (activityCount > 0)
{
Logger.Instance.Info($"Handled {activityCount} pending rated activities");
}
}
catch (Exception exception)
{
Logger.Instance.Error(exception, CultureInfo.CurrentCulture,
"An error occured while handling pending rated activities");
}
}
} while (!cancellationToken.WaitHandle.WaitOne(_pollingInterval));
Ограничения императивного стиля
Cross-cutting concerns
Convert exceptions into Failures
Алгебраические типы данных
type Option<'T> =
| Some of 'T
| None
type Season = Autumn | Winter | Spring | Summer
type Profile = {
FirstName: string
LastName: string
}
Pattern Matching
let printSomeOrNone x =
match x with
| Some(y) -> printfn "some: %A" y
| None -> printfn "none"
| _ -> printfn "Never hit"
// only use if you have to
Организация приложения в
функциональном стиле
Монада – это просто моноид в категории
эндофункторов
• Если не затрагивать тему гомоморфизмов
• В чем проблема?
Какие милые котята
Ой, какие щеночки
Уиии, лошадки
Определение порядковых чисел по фон
Нейману
• Множество S является ординалом тогда и только тогда, когда оно
строго вполне упорядочено отношением «принадлежать» и
каждый элемент S одновременно является его подмножеством
• Любой ординал есть вполне упорядоченное множество,
состоящее из всех ординалов, меньших его
Основы теории категорий
• В программах, использующих операционную семантику, очень трудно
что-то доказать. Чтобы показать некое свойство программы вы, по
сути, должны «запустить ее» через идеализированный интерпретатор
• Но есть и альтернатива. Она называется денотационной семантикой и
основана на математике. В денотационной семантике для каждой
языковой конструкции описана математичесая интерпретация
• По сравнению с теоремами, которые доказывают профессиональные
математики, задачи, с которыми мы сталкиваемся в
программировании, как правило, довольно просты, если не
тривиальны
Какова математическая модель для чтения
символа с клавиатуры, или отправки пакета по
сети?
• Долгое время это был бы неловкий вопрос, ведущий к довольно
запутанным объяснениям. Казалось, денотационная семантика
не подходит для значительного числа важных задач, которые
необходимы для написания полезных программ, и которые могут
быть легко решаемы операционной семантикой
• Прорыв произошел из теории категорий. Евгенио Моджи
обнаружил, что вычислительные эффекты могут быть
преобразованы в монады
Чистая функция
• Является детерминированной
• Не обладает побочными эффектами
• В Haskell все функции чистые, поэтому без монады IO нельзя
написать hello world
Категория
Warning Math ahead
Моноид – это категория
• 1 + 2 = 3
• 1 + (2 + 3) = (1 + 2) + 3
• 1 + 0 = 1
• 0 + 1 = 1
Строки – тоже моноид
• "Foo" + "Bar" = "FooBar"
• "Foo" + ("Bar" + "Baz") = ("Foo" + "Bar") + "Baz"
• "Foo" + "" = "Foo«
• "" + "Foo" = "Foo"
Монада как значение в контексте
Монада как значение в контексте
Map (fmap, lift, Select, <$>, <!>)
1. (a->b) -> M<a> -> M<b>
2. fmap id = id
3. fmap (g >> f) = (fmap g) >> (fmap f)
Return ( pure, unit, yield, point)
• A -> M<A>
Apply <*>
• M<(a->b)> -> M<a> -> M<b>
• Аппликативные функторы применяют упакованную функцию к
упакованному же значению:
• Используя apply и return можно сконструировать map
Bind (flatMap, andThen, SelectMany >>=)
• (a -> M<b>) -> M<a> -> M<b>
>>=
Maybe
• Является функтором, аппликативным функтором и монадой
одновременно
Все вместе
• функтор: вы применяете функцию к упакованному значению,
используя fmap или <$>
• аппликативный функтор: вы применяете упакованную функцию к
упакованному значению, используя <*> или liftA
• монада: вы применяете функцию, возвращающую упакованное
значение, к упакованному значению, используя >>= или liftM
Either Control Flow
public static ActionResult ViewOrError<TIn, TOut>(
this IQueryController<TIn,TOut> controller, TIn spec)
where TIn : class, new()
where TOut : class
=> spec.ThisOrDefault()
.ToWorkflow(
x => controller.ModelState.IsValid,
x => (OrderFailure?)OrderFailure.ArgumentInvalidState)
.Then(x => controller.Query.Ask(x))
.Then(x => x != null, controller.View, x => OrderFailure.ObjectNotFound)
.Finish(x => x, x => x.ToActionResult());
Императивный аналог
protected ActionResult ViewOrErrorImperative<TIn, TOut>(IQuery<TIn, TOut> query, TIn spec)
where TIn : class, new()
where TOut : class
{
if (spec == null)
{
spec = new TIn();
}
if (ModelState.IsValid)
{
var data = query.Ask(spec);
if (data != null)
{
return View(data);
}
return new HttpNotFoundResult();
}
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Монады
• LINQ
• Async/Await
• Map/Reduce
• Lazy<T>
• Nullable<T>
• IEnumerable<T>
• Task<T>
SelectMany
public static Maybe<int> Add(this Maybe<int> m, Maybe<int> add) =>
from v1 in m
from v2 in add
select v1 + v2;
Бастион ООП содержит монады (на
странице 243)
Interpreter is Free Monad
Interpreter
• Expression Tree
• RegEx
Другие элементы ФП, которые мы
используем каждый день
• Делегаты
• Ad-Hoc полиморфизм
• String
• Замыкания
• Bind
• Promise
ООП VS ФП
• Инкапсуляция -> Immutability
• Наследование -> Композиция, Каррирование, Частичное
применение, Continuation Style
• Полиморфизм -> Вывод типов, Монады
Сильные стороны
• Повышение надёжности кода
• Возможность формального доказательства корректности программы
• Удобство организации модульного тестирования
• Возможности оптимизации при компиляции
• Возможности параллелизма
• Лучшие возможности композиции и повторного использования кода
• Значительное уменьшение количества строк кода и cyclomatic
complexity
• Лучшая читабельность
Недостатки
• Необходимости постоянного выделения и автоматического
освобождения памяти
• Нестрогая модель вычислений приводит к непредсказуемому порядку
вызова функций, что создает проблемы с побочными эффектами
• Отсутствие алгоритмической базы для функциональных структур
данных
• Принципиальная невозможность эффективной реализации некоторых
важных эмпиративных алгоритмов (например, quicksort)
• Нехватка специалистов на рынке труда
• В Haskell ввод/вывод реализован с помощью не тривиальных
абстракций – монад
Сколько раз в день ваша бабушка
пользуется ПО?
• Ни одного
• Один раз
• От двух до пяти
• Да постоянно!
Сколько раз в день ваша бабушка
пользуется ПО?
• Начисление пенсии
• Оплата товаров в магазине
• Социальные льготы
• Медицинское страхование
• ...
Список использованных материалов
• http://fsharpforfunandprofit.com/
• https://habrahabr.ru/post/79713/
• https://habrahabr.ru/post/183150/
• https://habrahabr.ru/post/245797/
• https://ru.wikipedia.org/
• https://ericlippert.com/2013/02/21/monads-part-one/
• http://blog.ploeh.dk/2016/04/11/async-as-surrogate-io/
• https://www.youtube.com/watch?v=ecIWPzGEbFc

More Related Content

What's hot

Python: ввод и вывод
Python: ввод и выводPython: ввод и вывод
Python: ввод и вывод
Theoretical mechanics department
 
Java. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыJava. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторы
Unguryan Vitaliy
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
corehard_by
 
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
Pavel Tsukanov
 
Алгоритмическая конструкция следование
Алгоритмическая конструкция следованиеАлгоритмическая конструкция следование
Алгоритмическая конструкция следование
Andrey Dolinin
 
апкс 2011 07_синтез_verilog
апкс 2011 07_синтез_verilogапкс 2011 07_синтез_verilog
апкс 2011 07_синтез_verilogIrina Hahanova
 
Scala Magic, Alexander Podhaliusin
Scala Magic, Alexander PodhaliusinScala Magic, Alexander Podhaliusin
Scala Magic, Alexander Podhaliusin
Vasil Remeniuk
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
Unguryan Vitaliy
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операции
Unguryan Vitaliy
 
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
MoscowJS
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Javametaform
 
Запись вспомогательный алгоритмов на языка Паскаль
Запись вспомогательный алгоритмов на языка ПаскальЗапись вспомогательный алгоритмов на языка Паскаль
Запись вспомогательный алгоритмов на языка Паскаль
Andrey Dolinin
 
20110515 systems of typed lambda_calculi_moskvin_lecture10
20110515 systems of typed lambda_calculi_moskvin_lecture1020110515 systems of typed lambda_calculi_moskvin_lecture10
20110515 systems of typed lambda_calculi_moskvin_lecture10Computer Science Club
 
Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.
Unguryan Vitaliy
 
359.краткое введение в систему octave
359.краткое введение в систему octave359.краткое введение в систему octave
359.краткое введение в систему octaveivanov1566359955
 
Базовые операторы Java
Базовые операторы JavaБазовые операторы Java
Базовые операторы Javametaform
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).
Olga Maksimenkova
 
Алгоритмы на ruby: перебор и рекурсия
Алгоритмы на ruby: перебор и рекурсияАлгоритмы на ruby: перебор и рекурсия
Алгоритмы на ruby: перебор и рекурсияEvgeny Smirnov
 
Ruby: работа с массивами
Ruby: работа с массивамиRuby: работа с массивами
Ruby: работа с массивами
Evgeny Smirnov
 

What's hot (20)

Python: ввод и вывод
Python: ввод и выводPython: ввод и вывод
Python: ввод и вывод
 
Java. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыJava. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторы
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
 
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
 
Алгоритмическая конструкция следование
Алгоритмическая конструкция следованиеАлгоритмическая конструкция следование
Алгоритмическая конструкция следование
 
апкс 2011 07_синтез_verilog
апкс 2011 07_синтез_verilogапкс 2011 07_синтез_verilog
апкс 2011 07_синтез_verilog
 
Scala Magic, Alexander Podhaliusin
Scala Magic, Alexander PodhaliusinScala Magic, Alexander Podhaliusin
Scala Magic, Alexander Podhaliusin
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
 
робот
роботробот
робот
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операции
 
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Java
 
Запись вспомогательный алгоритмов на языка Паскаль
Запись вспомогательный алгоритмов на языка ПаскальЗапись вспомогательный алгоритмов на языка Паскаль
Запись вспомогательный алгоритмов на языка Паскаль
 
20110515 systems of typed lambda_calculi_moskvin_lecture10
20110515 systems of typed lambda_calculi_moskvin_lecture1020110515 systems of typed lambda_calculi_moskvin_lecture10
20110515 systems of typed lambda_calculi_moskvin_lecture10
 
Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.
 
359.краткое введение в систему octave
359.краткое введение в систему octave359.краткое введение в систему octave
359.краткое введение в систему octave
 
Базовые операторы Java
Базовые операторы JavaБазовые операторы Java
Базовые операторы Java
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).
 
Алгоритмы на ruby: перебор и рекурсия
Алгоритмы на ruby: перебор и рекурсияАлгоритмы на ruby: перебор и рекурсия
Алгоритмы на ruby: перебор и рекурсия
 
Ruby: работа с массивами
Ruby: работа с массивамиRuby: работа с массивами
Ruby: работа с массивами
 

Viewers also liked

program development and paradigms
program development and paradigmsprogram development and paradigms
program development and paradigms
kasenerd
 
Programming fundamentals lecture 1&2
Programming fundamentals lecture 1&2Programming fundamentals lecture 1&2
Programming fundamentals lecture 1&2
Raja Hamid
 
Fundamental Programming Lect 1
Fundamental Programming Lect 1Fundamental Programming Lect 1
Fundamental Programming Lect 1
Namrah Erum
 
General OOP concept [by-Digvijay]
General OOP concept [by-Digvijay]General OOP concept [by-Digvijay]
General OOP concept [by-Digvijay]
Digvijay Singh Karakoti
 
Object Orinted Programing(OOP) concepts \
Object Orinted Programing(OOP) concepts \Object Orinted Programing(OOP) concepts \
Object Orinted Programing(OOP) concepts \
Pritom Chaki
 
Programing Language
Programing LanguagePrograming Language
Programing Language
76 Degree Creative
 
Programing language
Programing languagePrograming language
Programing language
James Taylor
 
Introduction to programing languages part 1
Introduction to programing languages   part 1Introduction to programing languages   part 1
Introduction to programing languages part 1
university of education,Lahore
 
Programing Fundamental
Programing FundamentalPrograming Fundamental
Programing Fundamental
Qazi Shahzad Ali
 
Functional Programming Principles & Patterns
Functional Programming Principles & PatternsFunctional Programming Principles & Patterns
Functional Programming Principles & Patterns
zupzup.org
 
Programming languages
Programming languagesProgramming languages
Programming languages
Asmasum
 
Functional Programming Patterns (NDC London 2014)
Functional Programming Patterns (NDC London 2014)Functional Programming Patterns (NDC London 2014)
Functional Programming Patterns (NDC London 2014)
Scott Wlaschin
 
Object Oriented Programming Concepts
Object Oriented Programming ConceptsObject Oriented Programming Concepts
Object Oriented Programming Concepts
thinkphp
 
Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)
Scott Wlaschin
 
Functional Programing Principles
Functional Programing PrinciplesFunctional Programing Principles
Functional Programing Principles
Jiaming Zhang
 

Viewers also liked (15)

program development and paradigms
program development and paradigmsprogram development and paradigms
program development and paradigms
 
Programming fundamentals lecture 1&2
Programming fundamentals lecture 1&2Programming fundamentals lecture 1&2
Programming fundamentals lecture 1&2
 
Fundamental Programming Lect 1
Fundamental Programming Lect 1Fundamental Programming Lect 1
Fundamental Programming Lect 1
 
General OOP concept [by-Digvijay]
General OOP concept [by-Digvijay]General OOP concept [by-Digvijay]
General OOP concept [by-Digvijay]
 
Object Orinted Programing(OOP) concepts \
Object Orinted Programing(OOP) concepts \Object Orinted Programing(OOP) concepts \
Object Orinted Programing(OOP) concepts \
 
Programing Language
Programing LanguagePrograming Language
Programing Language
 
Programing language
Programing languagePrograming language
Programing language
 
Introduction to programing languages part 1
Introduction to programing languages   part 1Introduction to programing languages   part 1
Introduction to programing languages part 1
 
Programing Fundamental
Programing FundamentalPrograming Fundamental
Programing Fundamental
 
Functional Programming Principles & Patterns
Functional Programming Principles & PatternsFunctional Programming Principles & Patterns
Functional Programming Principles & Patterns
 
Programming languages
Programming languagesProgramming languages
Programming languages
 
Functional Programming Patterns (NDC London 2014)
Functional Programming Patterns (NDC London 2014)Functional Programming Patterns (NDC London 2014)
Functional Programming Patterns (NDC London 2014)
 
Object Oriented Programming Concepts
Object Oriented Programming ConceptsObject Oriented Programming Concepts
Object Oriented Programming Concepts
 
Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)
 
Functional Programing Principles
Functional Programing PrinciplesFunctional Programing Principles
Functional Programing Principles
 

Similar to Functional Programing

Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.
Sergey Tihon
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Dmitri Soshnikov
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
Fwdays
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)ScalaNsk
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
Alexander Granin
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
Stfalcon Meetups
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Yandex
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
Tech Talks @NSU
 
Back to the Future: Функциональное программирование вчера и сегодня
Back to the Future: Функциональное программирование вчера и сегодняBack to the Future: Функциональное программирование вчера и сегодня
Back to the Future: Функциональное программирование вчера и сегодня
Tech Talks @NSU
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
Igor Shkulipa
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
Andrey Dolinin
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
OdessaJS Conf
 
Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?
Yauheni Akhotnikau
 
модель акторов и C++ что, зачем и как ?
модель акторов и C++ что, зачем и как ?модель акторов и C++ что, зачем и как ?
модель акторов и C++ что, зачем и как ?
corehard_by
 
Power of LINQ
Power of LINQPower of LINQ
Power of LINQ
Juri Mulenko
 

Similar to Functional Programing (20)

Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
 
Discovering Lambdas (Speech)
Discovering Lambdas (Speech)Discovering Lambdas (Speech)
Discovering Lambdas (Speech)
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
 
Back to the Future: Функциональное программирование вчера и сегодня
Back to the Future: Функциональное программирование вчера и сегодняBack to the Future: Функциональное программирование вчера и сегодня
Back to the Future: Функциональное программирование вчера и сегодня
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
 
Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?
 
модель акторов и C++ что, зачем и как ?
модель акторов и C++ что, зачем и как ?модель акторов и C++ что, зачем и как ?
модель акторов и C++ что, зачем и как ?
 
Power of LINQ
Power of LINQPower of LINQ
Power of LINQ
 

Functional Programing

  • 1. λ
  • 2. ФП появилось раньше ООП и структурного программирования LISP 1958 Закон Мура 1965 Simula 1967 Структурное программирование 1970 ML 1973 С++ 1983 Ocaml 1985 Erlang 1987 Haskell 1990 Scala 2003 F# 2005 Clojure 2007 Elm 2012 More than Moore 2014
  • 3. Но не получило распространения в индустрии из-за дороговизны памяти на заре computer science, хотя и нашло свое место в научных кругах
  • 4. Интерес вернулся в последние 5 лет • Закон Мура «выдыхается» • Популярность облачных решений растет • Big Data, машинное обучение, боты, когнитивные сервисы
  • 5. LISP • Появился в 1958 году • Создатель Лиспа Джон Маккарти занимался исследованиями в области искусственного интеллекта (в дальнейшем ИИ) и созданный им язык по сию пору является одним из основных средств моделирования различных аспектов ИИ • Это один из старейших (наряду с Фортраном и Коболом) используемых по сей день высокоуровневых языков программирования • Основой архитектуры его является лямбда-исчисление • Интерпретатор Лиспа, написанный на Лиспе, занимает 15 строк
  • 6. Что не так с состоянием? • Locking, Memory Bandwidth • How To Reproduce / Debug • Race Conditions • Side Effects • Не возможно доказать корректность программы
  • 7. Чему равен y? var x = 2; DoSomething(x); // чему равен y? var y = x - 1;
  • 9. Это JavaScript  function DoSomething (foo) { x = false } var x = 2; DoSomething(x); var y = x - 1;
  • 10. Функциональное программиирование • Раздел дискретной математики и парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних • Понимание функции отличается от функции как подпрограммы в процедурном программировании
  • 11. Функция – Соответствие между элементами двух множеств, установленное по такому правилу, что каждому элементу одного множества ставится в соответствие некоторый элемент из другого множества.
  • 12. Принцип разделения интерфейса Принцип разделения интерфейсов говорит о том, что слишком «толстые» интерфейсы необходимо разделять на более маленькие и специфические, чтобы клиенты маленьких public interface IMessyCalc { float Add(float a, float b); Rocket LaunchRocket(); // WAT? }
  • 13. Принцип разделения интерфейса public interface ICalc { float Add(float a, float b); } public interface IRocketLauncher { Rocket LaunchRocket(); // ok }
  • 14. ICalc проще let add x y = x + y; // float -> float -> float
  • 15. Функции и вывод типов let add1 x = x + 1 // int -> int let add2 x = x + 2 // int -> int let add3C = add1 >> add2 //композиция let add3P x = x |> add1 |> add2 // pipe-оператор let toString x = x.ToString() // 'a -> string
  • 19. Каррирование и частичное применение let printTwoParameters x y = printfn "x=%i y=%i" x y //explicitly curried version let printTwoParametersC x = // only one parameter! let subFunction y = printfn "x=%i y=%i" x y // new function with one param subFunction let add x y = x + y let add1P = add 1 let v = add1P 2 let result = [1..10] |> List.map (fun i -> i+1) |> List.filter (fun i -> i>5)
  • 20. Изменяемые данные (не тру) let mutable mut = 5 mut <- 6
  • 22. λ-исчисление • Формальная система, разработанная американским математиком Алонзо Чёрчем, для формализации и анализа понятия вычислимости • Строится на простых двух операциях: аппликации и абстракции • Определены фундаментальные понятия α-эквивалентностью и β- редукции • Многие функциональные языки можно рассматривать как "надстройку" над ними
  • 23. λ-исчисление • Нет циклов • Нет переменных • Нет операции присвоения • Нет изменяемого состояния • Нет условных переходов и циклов • Нет «обычной» рекурсии • Обладает свойством полноты по Тьюрингу и, следовательно, представляет собой простейший язык программирования
  • 24. Теорема о неподвижной точке • И в λ-исчислении, и в комбинаторной логике для каждого терма X существует по крайней мере один терм P такой, что XP = P. И более того, существует комбинатор Y такой, что YX = X(YX) • Комбинатор неподвижной точки преобразует нерекурсивную функцию, вычисляющую один шаг рекурсии, в рекурсивную • Y = λf.(λx.f(xx))(λx.f(xx)) • Z = λf.(λx.f(λy.xxy))(λx.f(λy.xxy)) • https://habrahabr.ru/post/79713/
  • 25. α-эквивалентность • λx.x и λy.y альфа-эквивалентные лямбда-термы и оба представляют одну и ту же функцию (функцию тождества). • Термы x и y не альфа-эквивалентны, так как они не находятся в лямбда абстракции
  • 27. Структурирование программ Expressions VS Statements Expression<Func<int, string>> expr = x => { return x.ToString(); }; CS0834 A lambda expression with a statement body cannot be converted to an expression tree
  • 28. Statement var str = "test"; var i = 1; if (flag) { str += i; } else { i++; }
  • 29. Expression var fiveOrSix = Math.Cos(1) > 0 ? 5 : 6;
  • 30. Fixed Expression<Func<int, string>> expr = x => x.ToString(); // ok
  • 31. Что возвращает функция? function DoSomething (foo) { if (foo > 5) return 2; throw "Error"; } var x = 2; DoSomething(x); var y = x - 1;
  • 32. Exception Handling Considered Harmful • Hidden Control Flow & Corrupt State • Mismatch With Parallel Programming • Exceptional Exceptions • Exceptions only really work reliably when nobody catches them
  • 33. do { using (var lifetimeScope = _container.BeginLifetimeScope()) { var billingService = lifetimeScope.Resolve<BillingService>(); try { int activityCount = billingService.ProcessNotRatedActivities(); if (activityCount > 0) { Logger.Instance.Info($"Handled {activityCount} pending rated activities"); } } catch (Exception exception) { Logger.Instance.Error(exception, CultureInfo.CurrentCulture, "An error occured while handling pending rated activities"); } } } while (!cancellationToken.WaitHandle.WaitOne(_pollingInterval));
  • 37.
  • 38.
  • 39. Алгебраические типы данных type Option<'T> = | Some of 'T | None type Season = Autumn | Winter | Spring | Summer type Profile = { FirstName: string LastName: string }
  • 40. Pattern Matching let printSomeOrNone x = match x with | Some(y) -> printfn "some: %A" y | None -> printfn "none" | _ -> printfn "Never hit" // only use if you have to
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54. Монада – это просто моноид в категории эндофункторов • Если не затрагивать тему гомоморфизмов • В чем проблема?
  • 58. Определение порядковых чисел по фон Нейману • Множество S является ординалом тогда и только тогда, когда оно строго вполне упорядочено отношением «принадлежать» и каждый элемент S одновременно является его подмножеством • Любой ординал есть вполне упорядоченное множество, состоящее из всех ординалов, меньших его
  • 59.
  • 60. Основы теории категорий • В программах, использующих операционную семантику, очень трудно что-то доказать. Чтобы показать некое свойство программы вы, по сути, должны «запустить ее» через идеализированный интерпретатор • Но есть и альтернатива. Она называется денотационной семантикой и основана на математике. В денотационной семантике для каждой языковой конструкции описана математичесая интерпретация • По сравнению с теоремами, которые доказывают профессиональные математики, задачи, с которыми мы сталкиваемся в программировании, как правило, довольно просты, если не тривиальны
  • 61. Какова математическая модель для чтения символа с клавиатуры, или отправки пакета по сети? • Долгое время это был бы неловкий вопрос, ведущий к довольно запутанным объяснениям. Казалось, денотационная семантика не подходит для значительного числа важных задач, которые необходимы для написания полезных программ, и которые могут быть легко решаемы операционной семантикой • Прорыв произошел из теории категорий. Евгенио Моджи обнаружил, что вычислительные эффекты могут быть преобразованы в монады
  • 62. Чистая функция • Является детерминированной • Не обладает побочными эффектами • В Haskell все функции чистые, поэтому без монады IO нельзя написать hello world
  • 65. Моноид – это категория • 1 + 2 = 3 • 1 + (2 + 3) = (1 + 2) + 3 • 1 + 0 = 1 • 0 + 1 = 1
  • 66. Строки – тоже моноид • "Foo" + "Bar" = "FooBar" • "Foo" + ("Bar" + "Baz") = ("Foo" + "Bar") + "Baz" • "Foo" + "" = "Foo« • "" + "Foo" = "Foo"
  • 67. Монада как значение в контексте
  • 68. Монада как значение в контексте
  • 69. Map (fmap, lift, Select, <$>, <!>) 1. (a->b) -> M<a> -> M<b> 2. fmap id = id 3. fmap (g >> f) = (fmap g) >> (fmap f)
  • 70.
  • 71.
  • 72.
  • 73. Return ( pure, unit, yield, point) • A -> M<A>
  • 74. Apply <*> • M<(a->b)> -> M<a> -> M<b> • Аппликативные функторы применяют упакованную функцию к упакованному же значению: • Используя apply и return можно сконструировать map
  • 75.
  • 76. Bind (flatMap, andThen, SelectMany >>=) • (a -> M<b>) -> M<a> -> M<b>
  • 77. >>=
  • 78.
  • 79. Maybe • Является функтором, аппликативным функтором и монадой одновременно
  • 80. Все вместе • функтор: вы применяете функцию к упакованному значению, используя fmap или <$> • аппликативный функтор: вы применяете упакованную функцию к упакованному значению, используя <*> или liftA • монада: вы применяете функцию, возвращающую упакованное значение, к упакованному значению, используя >>= или liftM
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87. Either Control Flow public static ActionResult ViewOrError<TIn, TOut>( this IQueryController<TIn,TOut> controller, TIn spec) where TIn : class, new() where TOut : class => spec.ThisOrDefault() .ToWorkflow( x => controller.ModelState.IsValid, x => (OrderFailure?)OrderFailure.ArgumentInvalidState) .Then(x => controller.Query.Ask(x)) .Then(x => x != null, controller.View, x => OrderFailure.ObjectNotFound) .Finish(x => x, x => x.ToActionResult());
  • 88. Императивный аналог protected ActionResult ViewOrErrorImperative<TIn, TOut>(IQuery<TIn, TOut> query, TIn spec) where TIn : class, new() where TOut : class { if (spec == null) { spec = new TIn(); } if (ModelState.IsValid) { var data = query.Ask(spec); if (data != null) { return View(data); } return new HttpNotFoundResult(); } return new HttpStatusCodeResult(HttpStatusCode.BadRequest); }
  • 89. Монады • LINQ • Async/Await • Map/Reduce • Lazy<T> • Nullable<T> • IEnumerable<T> • Task<T>
  • 90. SelectMany public static Maybe<int> Add(this Maybe<int> m, Maybe<int> add) => from v1 in m from v2 in add select v1 + v2;
  • 91. Бастион ООП содержит монады (на странице 243)
  • 94. Другие элементы ФП, которые мы используем каждый день • Делегаты • Ad-Hoc полиморфизм • String • Замыкания • Bind • Promise
  • 95. ООП VS ФП • Инкапсуляция -> Immutability • Наследование -> Композиция, Каррирование, Частичное применение, Continuation Style • Полиморфизм -> Вывод типов, Монады
  • 96. Сильные стороны • Повышение надёжности кода • Возможность формального доказательства корректности программы • Удобство организации модульного тестирования • Возможности оптимизации при компиляции • Возможности параллелизма • Лучшие возможности композиции и повторного использования кода • Значительное уменьшение количества строк кода и cyclomatic complexity • Лучшая читабельность
  • 97. Недостатки • Необходимости постоянного выделения и автоматического освобождения памяти • Нестрогая модель вычислений приводит к непредсказуемому порядку вызова функций, что создает проблемы с побочными эффектами • Отсутствие алгоритмической базы для функциональных структур данных • Принципиальная невозможность эффективной реализации некоторых важных эмпиративных алгоритмов (например, quicksort) • Нехватка специалистов на рынке труда • В Haskell ввод/вывод реализован с помощью не тривиальных абстракций – монад
  • 98. Сколько раз в день ваша бабушка пользуется ПО? • Ни одного • Один раз • От двух до пяти • Да постоянно!
  • 99. Сколько раз в день ваша бабушка пользуется ПО? • Начисление пенсии • Оплата товаров в магазине • Социальные льготы • Медицинское страхование • ...
  • 100. Список использованных материалов • http://fsharpforfunandprofit.com/ • https://habrahabr.ru/post/79713/ • https://habrahabr.ru/post/183150/ • https://habrahabr.ru/post/245797/ • https://ru.wikipedia.org/ • https://ericlippert.com/2013/02/21/monads-part-one/ • http://blog.ploeh.dk/2016/04/11/async-as-surrogate-io/ • https://www.youtube.com/watch?v=ecIWPzGEbFc