Каррирование и частичное применение
Преобразуйте функции с несколькими аргументами в каррированные формы
«Каррирование и частичное применение» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Чистые функции и неизменяемость
- Каррирование и частичное применение
- Композиция функций с типами
- Типизированные утилиты pipe и flow