Size: a a a

Kotlin Community

2020 March 25

AO

Alexey Otts in Kotlin Community
Alexander Nozik
Есть неявность как только начинаются орфаны
Можно пример?
источник

BV

Boris Vanin in Kotlin Community
Alexey Otts
Инстанс или способ этот инстанс получить, смотрит в компаньон класса и компаньон тайп класса, ну и ещё в текущий скоуп
Ну, это всё в пределах сахара
источник

AO

Alexey Otts in Kotlin Community
Boris Vanin
Ну, это всё в пределах сахара
Ну просто чтобы руки не стирать пока пишешь какие функции надо вызывать чтобы получить тот или иной инстанс
источник

AO

Alexey Otts in Kotlin Community
Главная фича что компилятор может может вызвать n функций чтобы получить инстанс
источник

BV

Boris Vanin in Kotlin Community
Alexey Otts
Главная фича что компилятор может может вызвать n функций чтобы получить инстанс
Да, это как раз то, за что имплиситы не любят
источник

BV

Boris Vanin in Kotlin Community
И любят тоже 🙈
источник

AN

Alexander Nozik in Kotlin Community
Alexander Levin
По-моему местами идея собрала худшее из двух миров. С точки зрения экстеншнов - мы размазали сигнатуру функции/проперти по целому файлу. С точки зрения тайпклассов - мы отложили слегка принятие решения по прокидыванию моноида/сумматора/whatever, а затем сиди и пиши в лучшем случае так: with(stringMonoid, intMonoid, listMonoid, ... /* skip million instances */, zMonoid) { (что не очень решает задачу, которую решают тайпклассы)

Я вижу пользу для скриптов, но дальше становится тяжело.
Ну меня в основном интересуют все-таки не фале-левел ресиверы, а обычные мульти-ресиверы. Тут скорее оборщение и примирение всего. Но тем не менее, давайте разберемся. Не совсем понятно, зачем прокидыват все "моноиды" (как мне они надоели). Вы же в точке вызова заведомо знаете тип, который будет использоваться.
источник

AO

Alexey Otts in Kotlin Community
Boris Vanin
Да, это как раз то, за что имплиситы не любят
Ну вот вообще не понятно почему, там же всё понятно что да откуда 🤷‍♂
источник

BV

Boris Vanin in Kotlin Community
Alexey Otts
Ну вот вообще не понятно почему, там же всё понятно что да откуда 🤷‍♂
Но это а любом случае не котлин вей, эксплисит где можно
источник

AO

Alexey Otts in Kotlin Community
Как говорится хорошо написанный dsl не требует понимания что откуда берётся
источник

AN

Alexander Nozik in Kotlin Community
Лично мне важно в том числе иметь stateful ресиверы, но тут меня сразу продуктами жизнедеятельности закидают.
источник

BV

Boris Vanin in Kotlin Community
Alexander Nozik
Лично мне важно в том числе иметь stateful ресиверы, но тут меня сразу продуктами жизнедеятельности закидают.
Конечно, без стейтфул ресиверов это будет очень жидко
источник

M

Melodeiro in Kotlin Community
Пытаюсь использовать SerializableDateTime из klock. Просто добавить его с @ContextualSerialization в @Serializable data class не выходит, выбрасывает исключение Can't locate argument-less serializer for class SerializableDateTime. For generic classes, such as lists, please provide serializer explicitly.

Нужно кастомный сериализатор писать? Или можно как-то проще?
источник

AL

Alexander Levin in Kotlin Community
Alexander Nozik
Ну меня в основном интересуют все-таки не фале-левел ресиверы, а обычные мульти-ресиверы. Тут скорее оборщение и примирение всего. Но тем не менее, давайте разберемся. Не совсем понятно, зачем прокидыват все "моноиды" (как мне они надоели). Вы же в точке вызова заведомо знаете тип, который будет использоваться.
Ну, в этом примерно и суть, не только я знаю, но и сколько-либо умный компилятор знает, что если я хочу Summator<Int> подставь уже написанный IntSummator.

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

Т.е. я не говорю, что в Котлине прямо нужны тайп классы (т.е. я скорее за, но я могу понять, что кому-то от этого будет больно потом). Я только про то, что файл-левел ресиверы не решает задачу тайпклассов.
источник

AN

Alexander Nozik in Kotlin Community
Alexander Levin
Ну, в этом примерно и суть, не только я знаю, но и сколько-либо умный компилятор знает, что если я хочу Summator<Int> подставь уже написанный IntSummator.

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

Т.е. я не говорю, что в Котлине прямо нужны тайп классы (т.е. я скорее за, но я могу понять, что кому-то от этого будет больно потом). Я только про то, что файл-левел ресиверы не решает задачу тайпклассов.
Скажем так, это самое близкое решение, которое я вижу, без внедрения имплиситов
источник

AS

Andrei Shikov in Kotlin Community
Alexander Levin
Ну, в этом примерно и суть, не только я знаю, но и сколько-либо умный компилятор знает, что если я хочу Summator<Int> подставь уже написанный IntSummator.

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

Т.е. я не говорю, что в Котлине прямо нужны тайп классы (т.е. я скорее за, но я могу понять, что кому-то от этого будет больно потом). Я только про то, что файл-левел ресиверы не решает задачу тайпклассов.
Arrow-kt делали чтот похожее в своем компайлер плагине, правда хз, когда они зарелизят его
источник

AN

Alexander Nozik in Kotlin Community
Andrei Shikov
Arrow-kt делали чтот похожее в своем компайлер плагине, правда хз, когда они зарелизят его
Арроу - это и есть KEEP-87 и они сначала хотели завезти совсем скалу, но потом умерили пыл, увидев реакцию. Сейчас то, что они предлагают и то, что предлагаем мы очень близко идейно, но ключевая разница по-прежнему как раз в явности или неявности разрешения контекста. В KEEP-87 контекст байндится к типу, в KEEP-176 к скоупу.
источник

M

Mi in Kotlin Community
Alexander Nozik
Арроу - это и есть KEEP-87 и они сначала хотели завезти совсем скалу, но потом умерили пыл, увидев реакцию. Сейчас то, что они предлагают и то, что предлагаем мы очень близко идейно, но ключевая разница по-прежнему как раз в явности или неявности разрешения контекста. В KEEP-87 контекст байндится к типу, в KEEP-176 к скоупу.
Биндить к скоупу это имплиситы в скале?
источник

AM

Andrew Mikhaylov in Kotlin Community
И при этом тайп-классы как раз про байндинг к типу, так как для одной пары (тайп-класс, тип) есть единственная реализация, если я правильно понимаю. То есть вы таки не о тайп-классах в том виде, в котором их все знают.
источник

AN

Alexander Nozik in Kotlin Community
Mi
Биндить к скоупу это имплиситы в скале?
нет. Там как имплиситный байнд по типу
источник