Pull to refresh

Comments 2

Больше похоже на partial application, чем curry. //зануда мод

(upd. сначала скопировал ошибочную версию, теперь верная, ссылка на плейграунд

Для начала хочу заметить, что вы решили более сложную задачу, чем просто каррирование :) Оригинал подразумевал превращение функции в "цепочку" функций одного аргумента, т.е. f(1, 2, 3) -> f(1)(2)(3), а вы сделали так, что можно вызывать сразу с несколькими.

Тем не менее, даже для этой задачи ваше решение кажется переусложненным. Проще всего, я думаю, было написать рекурсию с явными аккумуляторами A1 и A2, которыми перебирать все такие значения, что [...A1, ...A2] = Parameters<F>:

type _Head<A extends any[]> = A extends [infer H, ...any[]] ? H : never;
type _Tail<A extends any[]> = A extends [any, ...infer T] ? T : never;

type _Recurse<F extends (...args: any[]) => any, A1 extends any[] = [], A2 extends any[] = Parameters<F>>
    = A2 extends []
        ? F
    : F extends (...a: [...A1, ...A2]) => infer R
        ? ((...a1: A1) => _Recurse<(...a2: A2) => R>) & (_Recurse<F, [...A1, _Head<A2>], _Tail<A2>>)
        : never;

type Curry<F extends (...args: any[]) => any> = _Recurse<F>;
Sign up to leave a comment.

Articles