SlideShare a Scribd company logo
1 of 24
Download to read offline
FP & CLOJURE
КАК ПРОЖИТЬ БЕЗ ПЕРЕМЕННЫХ
Дмитрий Цепелев /
г. Владимир
@dmitrytsepelev
AnjLab
СУТЬ ФП
Функция - это алгоритм, который применяется к
данным. Данные не могут изменяться, только
создаваться.
Переменных нет совсем, но есть . И состояния
тоже нет!
binding
ООП: ПРОГРАММА - ГРАФ
ФП: ПРОГРАММА - ДЕРЕВО
ФУНКЦИОНАЛЬНЫЕ ЯЗЫКИ
Чистые:
Haskell
Elm
Смешанные:
Erlang
Elixir
Clojure
CLOJURE
функциональный язык
JVM
LISP (все есть список!)
ЧИСТЫЕ ФУНКЦИИ
Функция может принимать аргументы и читать
только их, а также вернуть новое значение
(def numbers '())
(concat numbers 3) ; => (3)
numbers ; => ()
Всегда один и тот же результат!
ФУНКЦИИ ВЫСШИХ ПОРЯДКОВ
Функция, которая может принимать функции как
аргументы и возвращать функцию как результат
называется функцией высшего порядка
Функция map принимает на вход функцию f и
коллекцию a, результатом ее работы будет
некоторая коллекция b, полученная в результате
применения функции f к каждому из элементов
коллекции a:
(map inc [0 1 2 3]) ; => (1 2 3 4)
Открываем фабрику инкрементаторов:
(defn inc-maker [inc-by] #(+ % inc-by))
(def inc3 (inc-maker 3))
(inc3 7) ; => 10
ДЕКОРИРОВАНИЕ
Каррирование - частичный вызов функции:
(def sum (partial reduce +))
Реализация функции partial для функции с двумя
агрументами:
(defn my-partial [fun first]
(fn [arg] (fun first arg)))
(def inc-all
(my-partial map inc))
(inc-all '(1 2 3)) ; => (2 3 4)
Кэширование:
(defn memoize [f]
(let [mem (atom {})]
(fn [& args]
(if-let [e (find @mem args)]
(val e)
(let [ret (apply f args)]
(swap! mem assoc args ret)
ret)))))
(def inc-cached (memoize inc))
(inc-cached 2) ; => 3
КОМПОЗИЦИЯ
Составление из простых функций сложной функции,
которая передает свои аргументы одной из
предоставленных функций, а каждый последующий
результат передает в виде агрумента следующей
функции, вызывая их в обратном порядке.
(defn square [n] (* n n))
(defn square-sum [list]
(reduce + (map #(square %) list))
(def square-sum
(comp
(partial reduce +)
(partial map #(square %))))
(square-sum '(1 2 3)) ; => 14
ДЕСТРУКТУРИЗАЦИЯ
Установка соответствия между именами и
элементами коллекции
(defn my-first [[first-thing]] first-thing)
(my-first ["oven" "bike" "war-axe"]) ; => "oven"
(defn chooser [[first-choice second-choice & unimportant-choices]]
(println (str "First choice: " first-choice))
(println (str "Second choice: " second-choice))
(println (str "Rest of choices: "
(clojure.string/join ", " unimportant-choices))))
(chooser ["Marmalade", "Handsome Jack", "Pigpen", "Aquaman"])
; => First choice: Marmalade
; => Second choice: Handsome Jack
; => Rest of choices: Pigpen, Aquaman
ЦИКЛЫ
(defn sum
([vals]
(sum vals 0))
([vals accumulating-total]
(if (empty? vals)
accumulating-total
(recur (rest vals) (+ (first vals) accumulating-total)))))
МУЛЬТИМЕТОДЫ
Разные реализации одного метода в зависимости от
входных параметров
(defmulti full-moon-behavior
(fn [were-creature] (:were-type were-creature)))
(defmethod full-moon-behavior :wolf
[were-creature]
(str (:name were-creature) " will howl and murder"))
(defmethod full-moon-behavior :simmons
[were-creature]
(str (:name were-creature) " will encourage people"))
(full-moon-behavior {:were-type :wolf :name "Rachel from next door"})
; => "Rachel from next door will howl and murder"
МАКРОСЫ
Макросы служат для метопрограммирования и
манипуляций с кодом. Альтернативная реализация
сложения двух чисел:
(defmacro infix [infixed]
(list (second infixed) (first infixed) (last infixed)))
(infix (1 + 1)) ; => 2
ПРЕИМУЩЕСТВА ФП
тестирование
отладка
многопоточность
горячее обновление
доказательные вычисления и оптимизация
КУДА ПОЙТИ ДАЛЬШЕ?
Clojure for the brave and true
4clojure
Q?

More Related Content

What's hot

359.краткое введение в систему octave
359.краткое введение в систему octave359.краткое введение в систему octave
359.краткое введение в систему octaveivanov1566359955
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonYandex
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++mcroitor
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данныхmcroitor
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli typesmcroitor
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Stfalcon Meetups
 
контейнеры STL
контейнеры STLконтейнеры STL
контейнеры STLmcroitor
 
теория рекурсивных функций
теория рекурсивных функцийтеория рекурсивных функций
теория рекурсивных функцийMariya_Lastochkina
 
[Youdz.ru] первообразная.
[Youdz.ru] первообразная.[Youdz.ru] первообразная.
[Youdz.ru] первообразная.You DZ
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...OdessaFrontend
 
Ecma script 6 yevhen diachenko
Ecma script 6 yevhen diachenkoEcma script 6 yevhen diachenko
Ecma script 6 yevhen diachenkoDenis Khabrenko
 

What's hot (20)

359.краткое введение в систему octave
359.краткое введение в систему octave359.краткое введение в систему octave
359.краткое введение в систему octave
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и Python
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данных
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli types
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
 
лек9 10
лек9 10лек9 10
лек9 10
 
контейнеры STL
контейнеры STLконтейнеры STL
контейнеры STL
 
теория рекурсивных функций
теория рекурсивных функцийтеория рекурсивных функций
теория рекурсивных функций
 
[Youdz.ru] первообразная.
[Youdz.ru] первообразная.[Youdz.ru] первообразная.
[Youdz.ru] первообразная.
 
очередь
очередьочередь
очередь
 
Reactive extensions
Reactive extensionsReactive extensions
Reactive extensions
 
Lecture 8
Lecture 8Lecture 8
Lecture 8
 
Lecture 5
Lecture 5Lecture 5
Lecture 5
 
верификация
верификацияверификация
верификация
 
Scala lecture #4
Scala lecture #4Scala lecture #4
Scala lecture #4
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
 
Java 8. Lambdas
Java 8. LambdasJava 8. Lambdas
Java 8. Lambdas
 
Ecma script 6 yevhen diachenko
Ecma script 6 yevhen diachenkoEcma script 6 yevhen diachenko
Ecma script 6 yevhen diachenko
 

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

Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияYandex
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxYandex
 
Subprograms in VHDL, Functions in VHDL
Subprograms in VHDL, Functions in VHDLSubprograms in VHDL, Functions in VHDL
Subprograms in VHDL, Functions in VHDLvitaliykulanov
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Functional Programing
Functional ProgramingFunctional Programing
Functional ProgramingMax Arshinov
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Mikhail Kurnosov
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.Igor Shkulipa
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)Ontico
 
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
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptSmartTools
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Николай Паламарчук "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
 

Similar to Функциональное программирование и Clojure (20)

Основы Python. Функции
Основы Python. ФункцииОсновы Python. Функции
Основы Python. Функции
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
 
Clojure #1
Clojure #1Clojure #1
Clojure #1
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajax
 
Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.
 
Subprograms in VHDL, Functions in VHDL
Subprograms in VHDL, Functions in VHDLSubprograms in VHDL, Functions in VHDL
Subprograms in VHDL, Functions in VHDL
 
десант презентация
десант презентациядесант презентация
десант презентация
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Functional Programing
Functional ProgramingFunctional Programing
Functional Programing
 
Discovering Lambdas (Speech)
Discovering Lambdas (Speech)Discovering Lambdas (Speech)
Discovering Lambdas (Speech)
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
 
структура программы
структура программыструктура программы
структура программы
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 

More from AnjLab

Изучайте Machine Learning во имя добра или Teach my shiny metal ass
Изучайте Machine Learning во имя добра или Teach my shiny metal assИзучайте Machine Learning во имя добра или Teach my shiny metal ass
Изучайте Machine Learning во имя добра или Teach my shiny metal assAnjLab
 
RxJava
RxJavaRxJava
RxJavaAnjLab
 
Магия AsyncDisplayKit
Магия AsyncDisplayKitМагия AsyncDisplayKit
Магия AsyncDisplayKitAnjLab
 
Функциональное программирование на Elixir
Функциональное программирование на ElixirФункциональное программирование на Elixir
Функциональное программирование на ElixirAnjLab
 
SpriteKit (AnjLab Tech Talks)
SpriteKit (AnjLab Tech Talks)SpriteKit (AnjLab Tech Talks)
SpriteKit (AnjLab Tech Talks)AnjLab
 
PassKit & Wallet marketing
PassKit & Wallet marketingPassKit & Wallet marketing
PassKit & Wallet marketingAnjLab
 
Swift, основы (в разрезе Enums)
Swift, основы (в разрезе Enums)Swift, основы (в разрезе Enums)
Swift, основы (в разрезе Enums)AnjLab
 

More from AnjLab (7)

Изучайте Machine Learning во имя добра или Teach my shiny metal ass
Изучайте Machine Learning во имя добра или Teach my shiny metal assИзучайте Machine Learning во имя добра или Teach my shiny metal ass
Изучайте Machine Learning во имя добра или Teach my shiny metal ass
 
RxJava
RxJavaRxJava
RxJava
 
Магия AsyncDisplayKit
Магия AsyncDisplayKitМагия AsyncDisplayKit
Магия AsyncDisplayKit
 
Функциональное программирование на Elixir
Функциональное программирование на ElixirФункциональное программирование на Elixir
Функциональное программирование на Elixir
 
SpriteKit (AnjLab Tech Talks)
SpriteKit (AnjLab Tech Talks)SpriteKit (AnjLab Tech Talks)
SpriteKit (AnjLab Tech Talks)
 
PassKit & Wallet marketing
PassKit & Wallet marketingPassKit & Wallet marketing
PassKit & Wallet marketing
 
Swift, основы (в разрезе Enums)
Swift, основы (в разрезе Enums)Swift, основы (в разрезе Enums)
Swift, основы (в разрезе Enums)
 

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