Машинописные подписи и теория категорий

Мне интересно, достаточно ли сейчас 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 не имеет возможности точно выразить этот тип печати. Я что-то упустил или это так?

0 ответов

Другие вопросы по тегам