Ну меня в основном интересуют все-таки не фале-левел ресиверы, а обычные мульти-ресиверы. Тут скорее оборщение и примирение всего. Но тем не менее, давайте разберемся. Не совсем понятно, зачем прокидыват все "моноиды" (как мне они надоели). Вы же в точке вызова заведомо знаете тип, который будет использоваться.
Ну, в этом примерно и суть, не только я знаю, но и сколько-либо умный компилятор знает, что если я хочу Summator<Int> подставь уже написанный IntSummator.
Важный момент - файл-левел не особо помогает тут, потому что не всегда то, что делается тайпклассами прямо такое глобальное. Т.е. средний случай, который мне приходит в голову, когда писал на Скале - условная функция traverse, где мне в одну строчку там надо будет подставить условный IO.applicative() и дальше об этом конкретном тайп классе забыть. А тут как будто бы тащи на уровень файл, засоряй на весь файл контекст, а затем потом руками специфицируй все равно.
Т.е. я не говорю, что в Котлине прямо нужны тайп классы (т.е. я скорее за, но я могу понять, что кому-то от этого будет больно потом). Я только про то, что файл-левел ресиверы не решает задачу тайпклассов.