Я читаю несколько статей и видеокурс по функциональному программированию, поэтому решил написать несколько статей, исходя из этих понятий. Надежда может помочь вам лучше понять функциональное программирование.
1. Введение
Функциональное программирование основано на одной концепции: отсутствии побочных эффектов.
Он не полагается на данные вне текущей функции и не изменяет данные, которые существуют вне текущей функции. Любая другая «функциональная вещь может быть получена из этого свойства.»
Это нефункциональный код в Typescript:
let a: number= 0 function incrementOfOne(){ return a+1 } incrementOfOne() // 1
Как мы видим, эта функция нечиста, потому что считывает данные из внешнего мира и модифицирует эти данные.
Это функциональный код, использующий чистую функцию:
function incrementOfOne(num:number){ return num+1 } incrementOfOne(0) // 1 incrementOfOne(2) // 3
Как видно из второго кода, мы ничего не изменяем в глобальном состоянии. Эти два кода показывают нам разницу между чистыми и нечистыми функциями.
Чистые функции детерминированы: вы точно знаете, что будет на выходе на основе ввода. Таким образом, ваш код будет гораздо предсказуемее, безопаснее и проще в отладке.
Единственная информация, которая нужна чистой функции, — это то, что передается ей в качестве входных данных, и единственное, что она делает, — это возвращает выходные данные.
Например, подумайте о блендере для фруктов:
Вы кладете фрукт, и он возвращает сок 😅. Сок зависит только от того, в какие фрукты вы кладете.
2. Итерация против рекурсии
Другой важной концепцией функционального программирования является рекурсия.
Итерация и рекурсия — это два разных способа заставить компьютер выполнять одни и те же операции много времени.
В итерации мы думаем о повторении как о цикле. В цикле мы обычно меняем данные по мере продвижения, что означает, что они не сохраняют состояние.
function sum(numbers: number[]) { let total = 0 for (let i = 0; i < numbers.length; i++) { total += numbers[i] } return total } sum([0,1,2,3,4]) // 10
Внутри этой функции я изменяю значение общей переменной с течением времени, поэтому этот код не работает должным образом.
В функциональном программировании мы используем рекурсию, чтобы выполнять одну и ту же операцию много раз.
В рекурсии мы будем использовать ссылку на себя. Это означает, что функция вызывает сама себя, единственное, о чем мы заботимся, это входное значение и выходное значение. Таким образом, мы не меняем ценность с течением времени.
function sums(numbers: number[]) { if (numbers.length === 1) { return numbers[0] } return numbers[0] + sums(numbers.slice(1)) } sums([1,2,3,4]) // 10
Как видите, нам нужен базовый случай, чтобы остановить рекурсию, чтобы не потеряться в бесконечном цикле. В нашем случае это когда в массиве чисел есть только один элемент.
Это первая из длинной серии статей, я ценю вашу поддержку!