Я пытаюсь написать общую функцию c карты, которая может работать с любыми Functor
, которая выглядит так:
interface Functor<A> {
map <B>(fn: (a: A) => B): Functor<B>;
inspect (): string;
}
function map2<X, Y, F1 extends Functor<X>, F2 extends Functor<Y>> (fn: (a: X) => Y) {
return function $map (functor: F1): F2 {
return functor.map(fn);
}
}
Однако, когда я пишу это, чтобы попытаться реализовать идею эта карта будет принимать функтор одного типа и возвращать функтор (возможно) другого типа, я получаю следующую ошибку:
Type 'Functor<Y>' is not assignable to type 'F2'.
'Functor<Y>' is assignable to the constraint of type 'F2', but 'F2' could be instantiated with a different subtype of constraint 'Functor<Y>'
Из того, что я понял после прочтения этого ответа, эта ошибка говорит мне, что после вызова functor.map(fn)
я могу получить функтор, который не совпадает с тем, который был введен?
Если это так, как я могу записать это в принудительно выполнить это (например, я вставил Maybe<A>
, я получил Maybe<B>
вместо Either<B>
или что-то в этом роде). Нужно ли мне переносить некоторые из этих ограничений в интерфейс Functor
?
Если это не то, что происходит, что происходит и как я могу решить эту проблему?