Функціональне програмування — парадигма програмування, де все є функцією, а побічні ефекти чітко відокремлені від логіки обчислень.
Програму можна уявити як функцію, яка має параметри та обчислює результат на основі цих параметрів.
Функціональне програмування є декларативним — програміст визначає, що програма повинна робити, але не визначає, як це робити.
Одна з визначальних властивостей функціонального програмування — усі структури даних незмінні.
Незмінність стану усуває всі умови змагання: між потоками немає спільного змінного стану.
Функція чиста, коли вона не має побічних ефектів. Побічний ефект — будь-яка модифікація або перевірка зовнішнього стану. Функція, яка читає з файлу, не є чистою, оскільки її результат залежить від вмісту файлу. Чисті функції завжди повертають той самий результат, якщо передано однакові параметри. Вони завжди створюють той самий вихід для даного входу і не змінюють глобальний стан. Чисті функції ідеально підходять для розпаралелювання, оскільки між викликами немає залежностей або спільного стану.
Нечисті функції - це функція, яка містить один або кілька побічних ефектів. Якщо програма не має нечистих функцій, нічого не буде виконано.
Функція виконується лише тоді, коли дійсно потрібен її результат. Результат потрібен, якщо він використовується з нечистої функції, наприклад. наприклад, записує у файл
Чисто функціональні мови програмування: Haskell, Idris, Elm.
Нечистофункціональні мови програмування: Scala, Elixir, F#.
Ліниве оцінювання є властивістю декларативного програмування: програму не потрібно виконувати в тому порядку, в якому вона була написана; не всі оператори повинні бути виконані.
Для списків використовуються три найпоширеніші операції:
• map — створюється новий список, у якому до кожного елемента застосовується функція та створюється новий список.
• фільтр — отримати підмножину списку з елементами, які відповідають критерію.
• зменшити — отримати скаляр зі списку шляхом застосування функції.
Розпаралелювання карт і операцій фільтрування: ці операції виконуються паралельно з даними, тобто кожен елемент може оброблятися незалежно.
• Розділіть колекцію вхідних даних на менші фрагменти.
• Обробляйте кожен шматок паралельно.
• Об’єднайте результати з усіх фрагментів.
Паралельність даних
• Для розподілу даних між потоками можна використовувати пул потоків.
• Коли пул запускається, створюється фіксована кількість потоків.
• Пулу потоків може бути призначено завдання, яке розділене самими потоками.
• Перевагою пулу потоків є те, що потоки можна повторно використовувати для кількох операцій і вони автоматично розподіляють завдання
Функціональний паралелізм
• Модель паралельності, коли всі потоки виконують різні операції з однаковими даними.
• Вирішує проблеми, коли над одними даними потрібно виконувати різні операції.
• Ми отримуємо прискорення, оскільки декілька дій виконуються паралельно.











