0Pricing
TypeScript Academy · Урок

Каррирование и частичное применение

Преобразуйте функции с несколькими аргументами в каррированные формы

«Каррирование и частичное применение» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.

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

Каррирование преобразует функцию с несколькими аргументами в цепочку функций с одним аргументом. Вместо f(a, b) вызывается f(a)(b).

Классический пример

Здесь add принимает одно число и возвращает функцию, ожидающую следующее. TypeScript автоматически выводит типы вложенных функций.

const add = (a: number) => (b: number) => a + b;
console.log(add(2)(3)); // 5

Типизация каррированной функции

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

type Add = (a: number) => (b: number) => number;
const add: Add = a => b => a + b;
console.log(add(10)(5)); // 15

Частичное применение

Частичное применение фиксирует часть аргументов сейчас, а остальные передаёт позднее. Для каррированной функции это означает просто вызвать её, выполнив меньше шагов.

const add = (a: number) => (b: number) => a + b;
const add10 = add(10); // partially applied
console.log(add10(1), add10(2)); // 11 12

Преимущества частичного применения

Вы можете создавать специализированные функции из общих. add10 — это повторно используемый именованный инструмент, полученный из обобщённого add, который повышает удобство чтения и повторного использования.

Каррирование трёх аргументов

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

const clamp = (min: number) => (max: number) => (x: number) =>
  Math.min(Math.max(x, min), max);
const toByte = clamp(0)(255);
console.log(toByte(300), toByte(-5)); // 255 0

Отлично подходит для map и фильтрации

Каррированные функции удобно передавать методам массивов, поскольку map ожидает функцию с одним аргументом. Частичное применение создаёт именно такую функцию.

const mul = (a: number) => (b: number) => a * b;
const triple = mul(3);
console.log([1, 2, 3].map(triple)); // [3, 6, 9]

Обобщённый помощник для каррирования

Вы можете написать типизированный вспомогательный метод, который каррирует функцию с двумя аргументами. Обобщённые типы сохраняют точность типов параметров и возвращаемого значения.

function curry2<A, B, R>(f: (a: A, b: B) => R) {
  return (a: A) => (b: B) => f(a, b);
}
const join = curry2((a: string, b: string) => a + b);
console.log(join("foo")("bar")); // foobar

Замыкания захватывают аргументы

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

const greet = (greeting: string) => (name: string) =>
  greeting + ", " + name;
const hi = greet("Hi");
console.log(hi("Sam")); // Hi, Sam

Когда не следует использовать каррирование

Каррирование каждой функции может ухудшить читаемость. Используйте его, когда частичное применение действительно полезно, например при настройке повторно используемых вспомогательных функций или создании композиций конвейеров.

Каррирование и параметры по умолчанию

Параметры по умолчанию задают значения, но не обеспечивают поэтапное применение. Каррирование даёт настоящее частичное применение, возвращая реальную функцию, которую можно передавать и повторно использовать.

Краткая проверка

Краткая проверка по этому уроку.

Итоги

Каррирование превращает f(a, b) в f(a)(b) — цепочку функций с одним аргументом, типизированных в виде вложенных стрелок. Затем частичное применение фиксирует начальные аргументы, создавая повторно используемые специализированные функции благодаря замыканиям.

Часто задаваемые вопросы

Урок «Каррирование и частичное применение» бесплатный?

Да — полный текст урока «Каррирование и частичное применение» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Каррирование и частичное применение»?

Преобразуйте функции с несколькими аргументами в каррированные формы Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Каррирование и частичное применение»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Чистые функции и неизменяемость
  2. Каррирование и частичное применение
  3. Композиция функций с типами
  4. Типизированные утилиты pipe и flow
← Назад к TypeScript Academy