ШФП 29.09.2015.pptx
- Количество слайдов: 26
Обзор концепций и языков функционального программирования Постаногов Игорь Пермь, 2015
Традиционное представление о функциональном программировании (defun fibonacci (N) "Compute the N'th Fibonacci number. " (if (or (zerop N) (= N 1)) 1 (+ (fibonacci (- N 1)) (fibonacci (- N 2)))))
Семантика LISP’a Объектно-ориентированная парадигма Функциональная парадигма Процедурная парадигма
Классификация языков программирования
Концепции ФП Функции высших порядков Чистые функции Рекурсия Ленивые вычисления Алгебраические типы данных + сопоставление с образцом
Функции высших порядков Трактование функций как значений Над функциями можно проводить операции Их можно комбинировать func map(List<A>, func: A → B) → List<B> func filter(List<A>, func: A → bool) → List<A> func filter’N’map(List<A>, func: A → B, func: A → bool) → List<B> = map(filter(List<A>, A → bool), A → B)
Функции высших порядков Трактование функций как значений Над функциями можно проводить операции Их можно комбинировать Преимущества: Создание переиспользуемых модулей У объектов в ООП с этим проблемы Оптимизация
Чистые функции Результат вычисления функции зависит только от аргументов Преимущества: Возможность возврата ранее посчитанного значения без пересчёта Возможность перезапуска вычисления в случае аппаратного сбоя В том числе на другом вычислительном узле
Рекурсия Решение задачи через саму себя, но с более простыми условиями Преимущества: Порой проще и нагляднее Меньшее количество присваиваний Автоматическая оптимизация хвостовой рекурсии к итерации
Ленивые вычисления Выполнение вычислений только при первом непосредственном использовании результата List<Friend> all. Friends = null if (friends. Friends. Count. Required) { all. Friends = consuming. Func() print(all. Friends. count) } if (friends. Friends. Print. Required) { if (all. Friends == null) all. Friends = consuming. Func() print. All(all. Friends) }
Ленивые вычисления Выполнение вычислений только при первом непосредственном использовании результата lazy List<F> all. Friends = consuming. Func() if (friends. Friends. Count. Required) { print(all. Friends. count) } if (friends. Friends. Print. Required) { print. All(all. Friends) }
Ленивые вычисления Выполнение вычислений только при первом непосредственном использовании результата Преимущества: Отделение вычислений от логики вывода Упрощение структуры кода Возможность организации бесконечных структур данных Фибоначчи fibs = 0 : 1 : zip. With (+) fibs (tail fibs)
Сопоставление с образцом Использование типов, адекватных предметной области, и упрощённое их сопоставление case class Address(street: String, number: Int) case class Person(name: String, age: Int, address: Address) List<Person> names. Of. People. On. Bukireva = people. map(person match case Person(name, _, Address(‘Букирева’, _)) => name case _ => )
Сопоставление с образцом Использование типов, адекватных предметной области, и упрощённое их сопоставление Преимущества: Повышение читаемости кода Адекватность задачам обработки данных Простота конвертации в JSON, XML
Языки с функциональной парадигмой Haskell Erlang F# Scala
Haskell https: //www. haskell. org/ Разработан сообществом Чистый функциональный язык программирования Преподаётся в университетах Университет Эдинбурга ИТМО Используется в коммерческой среде Финансовая аналитика Разработка электроники
Erlang http: //www. erlang. org/ Разработан компанией Ericsson Функциональный ЯП для распределённых систем Используется в коммерческой среде Телекоммуникационные системы Back-end для чата No. SQL БД (язык реализации)
F# http: //fsharp. org/ Разработан компанией Microsoft Объектно-функциональный ЯП OCaml поверх. NET
Scala http: //scala-lang. org/ Разработан в университете Лозанны (EPFL) Объектно-функциональный ЯП Компилируется в Java-байткод
Тренды Аналитика Больших Данных Распределённые системы
Большие данные Что? Серия подходов, инструментов и методов обработки структурированных и неструктурированных данных огромных объёмов и значительного многообразия При каких условиях? Непрерывный прирост данных Распределение по многочисленным узлам вычислительной сети
Средства для анализа Big Data Map. Reduce Стек Apache Spark Streaming Spark SQL MLlib
Resilient Distributed Datasets в Spark
Распределённые системы Модель акторов Автономные вычислительные процессы Коммуникация только посредством сообщений Преимущества: Масштабируемость Отказоустойчивость (перезапуск) Реализация - Akka
Что дальше? Introduction to Functional Programming, ed. X Functional Programming Principles in Scala, Coursera Learn you some Erlang Learn You a Haskell for Great Good!
Контакты Школа функционального программирования (г. Пермь) https: //vk. com/tryfuture Игорь Постаногов ipostanogov@outlook. com https: //vk. com/ipostanogov
ШФП 29.09.2015.pptx