Я читаю несколько статей и видеокурс по функциональному программированию, поэтому решил написать несколько статей, исходя из этих понятий. Надежда может помочь вам лучше понять функциональное программирование.

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

Как видите, нам нужен базовый случай, чтобы остановить рекурсию, чтобы не потеряться в бесконечном цикле. В нашем случае это когда в массиве чисел есть только один элемент.

Это первая из длинной серии статей, я ценю вашу поддержку!