Size: a a a

Kotlin Community

2020 March 25

BV

Boris Vanin in Kotlin Community
О, я знаю, @eld0727 дай пример где тайпклассы на твой взгляд уместны, а @noraltavir напишет как решить это с помощью его решения
источник

AN

Alexander Nozik in Kotlin Community
Boris Vanin
О, я знаю, @eld0727 дай пример где тайпклассы на твой взгляд уместны, а @noraltavir напишет как решить это с помощью его решения
Я что-то такое и хотел предложить.
источник

AO

Alexey Otts in Kotlin Community
Alexander Nozik
Будет тут ваш полиморфизм, просто в интерфейсе определяются экстеншен методы с полиморфизмом вместе
Ну вот смотри простой пример использования тайпклассов
def add[T: Monoid](a: T, b: T): T = a + b


Эту функцию я могу вызвать для любого типа на котором определён моноид, как тот кип сюда приплести?
источник

AZ

Alexander Zalutskiy in Kotlin Community
Моноид фигня) Вот какой-нибудь CoMonad интереснее)
источник

AO

Alexey Otts in Kotlin Community
Alexander Zalutskiy
Моноид фигня) Вот какой-нибудь CoMonad интереснее)
да не суть, механизм диспатчеризации должен быть одинаковый +-
источник

AZ

Alexander Zalutskiy in Kotlin Community
Alexey Otts
да не суть, механизм диспатчеризации должен быть одинаковый +-
Resolve типов разный. Monoid можно и в чистом kotlin на интерфейсах описать. Будет выглядеть по использованию один в один. А вот контейнерные типы
источник

AO

Alexey Otts in Kotlin Community
Но это не самое интересное, как предлагается проварачивать такие вещи:
1) У меня есть моноид для int
2) У меня есть моноид для ?
3) Как на этом подходе сделать add(1, null)?
источник

AN

Alexander Nozik in Kotlin Community
Alexey Otts
Ну вот смотри простой пример использования тайпклассов
def add[T: Monoid](a: T, b: T): T = a + b


Эту функцию я могу вызвать для любого типа на котором определён моноид, как тот кип сюда приплести?
Это не тайп-классы уже, а HKT, но давайте попробуем:
 
interface Summator<T>{
 operator fun T.plust(other: T)
}

use Summator<Complex>

val a: Complex
val b: Complex

val c = a + b
источник

AO

Alexey Otts in Kotlin Community
Alexander Nozik
Это не тайп-классы уже, а HKT, но давайте попробуем:
 
interface Summator<T>{
 operator fun T.plust(other: T)
}

use Summator<Complex>

val a: Complex
val b: Complex

val c = a + b
Где тут HKT?
источник

AO

Alexey Otts in Kotlin Community
Alexander Nozik
Это не тайп-классы уже, а HKT, но давайте попробуем:
 
interface Summator<T>{
 operator fun T.plust(other: T)
}

use Summator<Complex>

val a: Complex
val b: Complex

val c = a + b
И да я предвидел этот вариант и кинул ситуацию выше
источник

AN

Alexander Nozik in Kotlin Community
В принципе можно то же делать с дженериками, но надо думать про синтакс и бордер кейсы
источник

AO

Alexey Otts in Kotlin Community
Ну то есть оно не решает тех же проблем, да можно будет несколько лучше делать абстракции, но это не тайп классы
источник

AO

Alexey Otts in Kotlin Community
И без хкт я опять немного начал страдать и тонуть в бойлерплейте в своей либе
источник

AN

Alexander Nozik in Kotlin Community
Alexey Otts
Ну то есть оно не решает тех же проблем, да можно будет несколько лучше делать абстракции, но это не тайп классы
Это декларация extension интерфейсов. Если добавить туда дженерики - будут тайп классы. Но тут надо придумать, как добавить
источник

AN

Alexander Nozik in Kotlin Community
В принципе и дженерикам ничего не мешает, но синтаксис может усложниться
источник

BV

Boris Vanin in Kotlin Community
Alexander Nozik
Это не тайп-классы уже, а HKT, но давайте попробуем:
 
interface Summator<T>{
 operator fun T.plust(other: T)
}

use Summator<Complex>

val a: Complex
val b: Complex

val c = a + b
Но опять нет реализации
источник

AN

Alexander Nozik in Kotlin Community
Boris Vanin
Но опять нет реализации
Реализация подставляется в точке вызова явно
источник

BV

Boris Vanin in Kotlin Community
Alexander Nozik
Реализация подставляется в точке вызова явно
Ну там ведь в примере есть точка вызова
источник

AN

Alexander Nozik in Kotlin Community
Boris Vanin
Ну там ведь в примере есть точка вызова
да
источник

BV

Boris Vanin in Kotlin Community
А реализации нет
источник