Как набрать стиль передачи словаря? - PullRequest
0 голосов
/ 16 апреля 2020

Я знаю, что TS не поддерживает типы с более высоким родом. В качестве альтернативы для языков без HKT и классов типов существует стиль передачи словаря:

const map = ({map}) => f => tx => map(f) (tx);

const arrMap = f => xs => xs.map(f);

const id = x => x;

const main = map({map: arrMap}) (id);

console.log(main([1,2,3]));

Как мне это ввести в TS?

const map = <A, B, C>(dict: {map: (f: (x: A) => B) => (tx: C) => C}) => (f: (x: A) => B) => (tx: C) =>
  dict.map(f) (tx);

const id = <A>(x: A) => x;

const arrMap = <A, B>(f: (x: A) => B) => (xs: A[]) => xs.map(f);

map({ map: arrMap }) (id) ([1, 2, 3]); // type annotation?

Можно ли избежать аннотации типа? Если нет, то как бы это выглядело?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Я сам разобрался:

type map = <A, B, C>(_: { map: (_: (_: A) => B) => (_: C) => C }) =>
  (_: (_: A) => B) => (_: C) => C;

type arrMap = <A, B>(_: (_: A) => B) => (_: A[]) => B[];
type id = <A>(_: A) => A;

const map: map = dict => f => tx => dict.map(f) (tx);
const id: id = x => x;

const arrMap: arrMap = <A, B>(f: (x: A) => B) => (xs: A[]) => xs.map(f);

// type annotation seems necessary
map<number, number, number[]>({ map: arrMap }) (id) ([1,2,3]);

Детская площадка

0 голосов
/ 16 апреля 2020

Я изменил «map» на «mapFn» из-за ошибки в tslint с «no-shadow-variable»

type IdType = (param: number) => number;
type ArrMapType = (f: IdType) => (xs: number[]) => number[];
type MapFnType = (params: { map: ArrMapType }) => (f: IdType) => (tx: number[]) => number[];

const mapFn: MapFnType = ({ map }) => f => tx => map(f)(tx);

const arrMap: ArrMapType = f => xs => xs.map(f);

const id: IdType = x => x;

const main = mapFn({ map: arrMap })(id);

console.log(main([1, 2, 3]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...