Машинописные подписи и теория категорий
Мне интересно, достаточно ли сейчас TypeScript достаточно выразителен для моделирования некоторых типовых сигнатур теории категорий.
Например, у меня может быть тип функтора, определенный как (я использую версию Fantasy Land для сигнатур типа Damas–Hindley–Milner):
fantasy-land/map :: Functor f => f a ~> (a -> b) -> f b
Сначала я думал, что смогу смоделировать его с помощью интерфейса TypeScript:
export interface Functor<A> {
["fantasy-land/map"]<B>(f: (source: A) => B): Functor<B>;
}
Который работает достаточно хорошо:
class Identity<A> implements Functor<A> {
constructor(private value: A) {}
["fantasy-land/map"]<B>(f: (source: A) => B): Functor<B> {
return new Identity(f(this.value));
}
}
Но вот проблема: тип возвращаемого значения не Identity<B>
, но Functor<B>
,
Использование подписей этого типа звучит как правильный путь, но таким образом я могу только вернуть Identity<A>
и нет Identity<B>
,
Таким образом, мне кажется, что TypeScript не имеет возможности точно выразить этот тип печати. Я что-то упустил или это так?