Функции высшего порядка. Рассмотрим простую операцию сокращения, суммирующую элементы массива. На императивном языке программисты обычно пишут сами циклы и выполняют сокращения по одному элементу за раз.
Но этот код нелегко сделать многопоточным. Когда вы пишете цикл, вы принимаете порядок операций и вам нужно объяснить, как перейти от одного элемента к другому. Вы действительно хотели бы просто сказать «суммировать массив» и попросить компилятор, или среду выполнения, или что-то еще, принять решение о том, как работать с массивом, разделить задачу по мере необходимости между несколькими ядрами и объединить эти результаты вместе , Таким образом, вместо того, чтобы писать цикл с некоторым дополнительным кодом, встроенным в него, альтернативой является передача чего-либо, представляющего «сложение», в функцию, которая может выполнять деление. Как только вы это сделаете, вы пишете функционально. Вы передаете функцию (дополнение) в другую функцию (редуктор). Если вы пишете таким образом, то это не только делает более читабельный код, но и когда вы меняете архитектуру или хотите писать для гетерогенной архитектуры, вам не нужно менять лето, просто редуктор. На практике у вас может быть много разных алгоритмов, которые все используют один редуктор, так что это большая отдача.
Это всего лишь простой пример. Вы можете развить это. Функции для применения других функций к двумерным массивам, функции для применения функций к древовидным структурам, функции для объединения функций для применения функций (например, если у вас есть иерархическая структура с деревьями вверху и массивами ниже) и т. Д.