в моем примере с нормалайзером есть фреймворк который предоставляет точку расширения - мол ты для своих типов можешь сделать свои штуки. Мне как автору фреймворка плевать что за типы там будут. Как разработчику который фреймворк юзает мне не плевать что в мои нормалайзеры приходит.
Как следствие тип я могу параметризовать что бы разработчик мог указать свой
Ну, потому что в идеальном мире у нас может быть Array implements Functor, Maybe implements Functor, и функция с сигнатурой map<F:Functor,A,B>(data: F<A>, fn: A -> B): F<B>
идешка видит что не то делаешь / стат анализаторы проверяют и находят что не то делаешь, и оповещают об этом. а если проигнорить - то на этапе выполнения возникнет ошибка... вроде как очеивидно все... не пойму, в чем затык то у меня...