Рубрики
Без рубрики

Карри в JavaScript

Небольшое введение в карри в JavaScript. В этой статье вы узнаете, что такое карри, как и зачем использовать его

Автор оригинала: Rémi.

Carrying – важная концепция, которая находится в основе любого функционального языка программирования. Итак, давайте посмотрим на то, что это такое и зачем использовать его.

Что такое карри?

Carrying – это означает преобразование функции ARITY N до н. Функции ARITY 1. Итак, это теория. Это просто означает, что Carrying позволяет вам не указывать все аргументы при вызове функции. Давайте возьмем простой пример. Вы должны быть использованы, чтобы сделать что-то вроде этого:

const add = (a, b) => a + b

add(1, 2) //should return 3

В каррифицированном пути я должен сделать что-то вроде этого:

const add = a => b => a + b

add(1)(2) //should return 3

Вы заметили, как Добавить Функция построена? Это функция, которая принимает один аргумент и возвращает другую функцию, которая принимает второй аргумент. Как только все аргументы будут там, вычисление происходит. Так в этом примере, позвонив Добавить (1) Возвращает функцию.

Карри возможен в JavaScript, потому что функции – гражданин первого класса. Это означает, что функции похожи на любые другие значения. Их можно назначить переменным, переданным в качестве аргумента для других функций и возвращаемых функциями.

Почему карри важно

Carrying дает вам возможность частично настроить функцию, а затем значит создавать многоразовые функции. Давайте возьмем еще один пример. Предположим, у меня есть коллекция, как это:

const movies = [
  {
    "id": 1,
    "name": "Matrix"
  },
  {
    "id": 2,
    "name": "Star Wars"
  },
  {
    "id": 3,
    "name": "The wolf of Wall Street"
  }
]

Теперь предположим, что я хочу извлечь идентификаторы этой коллекции. Я мог бы просто использовать карта Функция для итерации по поводу коллекции:

movies.map((movie) => movie.id) //should return [ 1, 2, 3 ]

Отлично, но предположим, что у меня вторая коллекция серии:

const series = [
  {
    "id": 4,
    "name": "South Park"
  },
  {
    "id": 5,
    "name": "The Simpsons"
  },
  {
    "id": 6,
    "name": "The Big Bang Theory"
  }
]

И предположим, что я хочу извлечь идентификаторы, как я делал раньше с фильмами:

series.map((serie) => serie.id) //should return [ 4, 5, 6 ]

Обратные вызовы карта строго одинаковы, но мы работали на двух разных коллекциях. В этом случае карри может быть решением. Давайте сделаем функцию call получить Это должно извлечь свойство от объекта:

const get = property => object => object[property];

Теперь из этой функции я могу создать другую функцию, называемую Гетид это просто частичная конфигурация получить Функция:

const getId = get('id');

На этом шаге Гетид Еще функция, и это здорово, потому что мы теперь можем использовать его внутри нашей карты:

movies.map(getId); //should return [ 1, 2, 3 ]
series.map(getId); //should return [ 4, 5, 6 ]

Разве это не приятно? Но мы можем пойти на один шаг дальше. Предположим, теперь мы хотим извлечь имя из наших объектов. Как вы можете достичь этого? Просто создайте функцию под названием getname происходит из получить Функция:

const getName = get('name');

А затем вы можете использовать его в ваших коллекциях, чтобы извлечь имя:

movies.map(getName); //should return [ 'Matrix', 'Star Wars', 'The wolf of Wall Street' ]

Заключение

Carrying является важной частью функциональной программирования. Я призываю вас играть с ним, как и в этой статье. Если вы используете функциональные библиотеки, такие как Рамда или Лоташ/ФП Большинство функций каррины по умолчанию, что отлично! Таким образом, помните, что разлагающиеся функции n аргументов N-функциям 1 аргумента не очень сложная задача с синтаксисом ES6 и функциями Lamda! Таким образом, у вас нет оправдания, чтобы не создавать многоразовый код благодаря карри!