Я следую за публикацией в блоге о функциональном программировании с использованием PureScript. Вот пример Box, который выглядит так в JavaScript:
const Box = x => ({
map: f => Box(f(x)),
fold: f => f(x),
inspect: () => `Box(${x})`
});
Я хотел бы напечатать это, используя TypeScript, чтобы иметь синтаксическую проверку для кода, подобного этому:
const nextCharForNumberString = str =>
Box(str)
.map(s => s.trim())
.map(s => new Number(s))
.map(i => i + 1)
.map(i => String.fromCharCode(i))
.fold(c => c.toLowerCase());
Я попытался напечатать поле, как это:
interface IBox<T> {
map: <U>(T) => IBox<U>;
fold: <U>(T) => U;
inspect: (T) => string;
}
const Box: <T>(x: T) => IBox<T> = x => ({
map: f => Box(f(x)),
fold: f => f(x),
inspect: () => `Box(${x})`
});
Это ставит меня в тупик, как правильно набирать функцию Box. В попытке упростить синтаксис я тоже попробовал это:
function Box<T>(x: T): IBox<T> {
return {
map: <U>(f): IBox<U> => Box(f(x)),
fold: <U>(f): U => f(x),
inspect: () => `Box(${x})`
};
}
Ни одна из моих попыток не работает полностью. Я хотел бы, чтобы это было поймано во время компиляции:
const s: IBox<String> = Box(5)
.map(x => x * x)
.map(x => x.toString())
.map(x => x * x)
.fold(x => x);
Мне кажется, что это возможно с помощью TypeScript. Любое понимание будет с благодарностью!