Избегайте использования переменной типа как неизвестной для функций с каррированием вручную - PullRequest
0 голосов
/ 04 мая 2020

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

type Const<A, B> = { const: A };

const Const = <A, B>(x: A): Const<A, B> => ({ const: x });

const map = <F, A, B>(f: (_: A) => B) => (tx: Const<F, B>) => tx;

const inc = (x: number) => x + 1;

const foo = map(inc) (Const("foo")); // Const<unknown, number> instead of <string, number>

Playground

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

1 Ответ

1 голос
/ 04 мая 2020

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

В этом случае F не имеет сайта вывода в map, он используется только в возвращении type (вывод из вызываемого возвращаемого типа, TS это не то, что делает, он выводит из возвращаемого типа в другом сценарии ios, но не это). Перемещение параметра типа в функцию, возвращаемую map, позволяет второму вызову вывести F и произвести ожидаемый тип.

type Const<A, B> = { const: A };

const Const = <A, B>(x: A): Const<A, B> => ({ const: x });

const map = <A, B>(f: (_: A) => B) => <F>(tx: Const<F, B>) => tx;

const inc = (x: number) => x + 1;

const foo = map(inc) (Const("foo")); 

Playground Link

...