Size: a a a

Programming Offtop

2020 September 21

(

( in Programming Offtop
Alexander Nozik
Надоело мне нытье этого ОСГС (общества свидетелей гетерогенных списков). Кейсы, где они нужны, появляются не чаще, чем раз в год. А таких, где нельзя вместо них использовать дата классы - вообще почти нет. Но нытья....
ну пожалуйста, ещё один кейс
источник

(

( in Programming Offtop
Навигация с факторями экранов
источник

(

( in Programming Offtop
Роутеру чтобы по идентификатору создавать и показывать экран нужно передать собсна фабрику экранов, если у роутера сделать женерик вида хлист со списком экранов, которые он использует, можно следить, что он не получает фабрику, в которой не хватает экранов
источник

AA

Andrey Akimov in Programming Offtop
Viktor Noskin
Учитывая, что я НЕ интересуюсь Моргенштерном, как Ютуб смог мне такое выдать?🥴
просто совпадение. У моргенштерна батю зовут Тагир Валеев
источник

AN

Alexander Nozik in Programming Offtop
(
Роутеру чтобы по идентификатору создавать и показывать экран нужно передать собсна фабрику экранов, если у роутера сделать женерик вида хлист со списком экранов, которые он использует, можно следить, что он не получает фабрику, в которой не хватает экранов
Дата класс как бы полностью покрывает случай
источник

(

( in Programming Offtop
Alexander Nozik
Дата класс как бы полностью покрывает случай
не покрывает
источник

(

( in Programming Offtop
я не буду просто в полях тягать какие-то фабрики поменьше, это муторно и глупо
источник

I

Ilmir in Programming Offtop
(
делать всякое типобезопасное
Можно без тьюринг полноты же:
interface Typelist<in T, out U>

interface Piano

interface O: Piano
interface S<T: Piano>: Piano

typealias One = S<O>
typealias Two = S<One>
typealias Three = S<Two>

@JvmName("len1")
fun <TL: Typelist<*, Typelist<*, Typelist<*, Nothing>>>> TL.length() = object : Three
@JvmName("len2")
fun <TL: Typelist<*, Typelist<*, Nothing>>> TL.length() = object : Two
@JvmName("len3")
fun <TL: Typelist<*, Nothing>> TL.length() = object : One
               
@JvmName("contains1")
fun <T, TL: Typelist<T, *>> TL.contains() = 1
@JvmName("contains2")
fun <T, TL: Typelist<*, Typelist<T, *>>> TL.contains() = 1
@JvmName("contains3")
fun <T, TL: Typelist<*, Typelist<*, Typelist<T, Nothing>>>> TL.contains() = 1

typealias A = Typelist<Any, Nothing>
typealias B = Typelist<Any, Typelist<Any, Nothing>>
typealias Integral = Typelist<Int, Typelist<Short, Typelist<Long, Nothing>>>

inline fun <reified T> Function<T>.eq() = 1

val ALEN = A::length.eq<One>()
val BLEN = B::length.eq<Two>()
val ILEN = Integral::length.eq<Three>()

// Compiler error
// val ILEN2 = Integral::length.eq<Two>()

val LI = (object : Integral {}).contains<Long, Integral>()
val SI = (object : Integral {}).contains<Short, Integral>()

// Compiler error
// val StrI = (object : Integral {}).contains<String, Integral>()
источник

I

Ilmir in Programming Offtop
Это мой любимый пример из Александреску. Так как из тайплиста нельзя просто так достать параметры, в отличие от плюсов, приходится копипастить.
источник

(

( in Programming Offtop
Ilmir
Можно без тьюринг полноты же:
interface Typelist<in T, out U>

interface Piano

interface O: Piano
interface S<T: Piano>: Piano

typealias One = S<O>
typealias Two = S<One>
typealias Three = S<Two>

@JvmName("len1")
fun <TL: Typelist<*, Typelist<*, Typelist<*, Nothing>>>> TL.length() = object : Three
@JvmName("len2")
fun <TL: Typelist<*, Typelist<*, Nothing>>> TL.length() = object : Two
@JvmName("len3")
fun <TL: Typelist<*, Nothing>> TL.length() = object : One
               
@JvmName("contains1")
fun <T, TL: Typelist<T, *>> TL.contains() = 1
@JvmName("contains2")
fun <T, TL: Typelist<*, Typelist<T, *>>> TL.contains() = 1
@JvmName("contains3")
fun <T, TL: Typelist<*, Typelist<*, Typelist<T, Nothing>>>> TL.contains() = 1

typealias A = Typelist<Any, Nothing>
typealias B = Typelist<Any, Typelist<Any, Nothing>>
typealias Integral = Typelist<Int, Typelist<Short, Typelist<Long, Nothing>>>

inline fun <reified T> Function<T>.eq() = 1

val ALEN = A::length.eq<One>()
val BLEN = B::length.eq<Two>()
val ILEN = Integral::length.eq<Three>()

// Compiler error
// val ILEN2 = Integral::length.eq<Two>()

val LI = (object : Integral {}).contains<Long, Integral>()
val SI = (object : Integral {}).contains<Short, Integral>()

// Compiler error
// val StrI = (object : Integral {}).contains<String, Integral>()
но это же классическое 22
источник

(

( in Programming Offtop
и.е. не то
источник

(

( in Programming Offtop
хотя contains красиво сделан, я до того не додумался
источник

I

Ilmir in Programming Offtop
(
но это же классическое 22
Ога. Ты просил типобезопасности, получи типобезопасность. Или сформулируй задачу конкретнее.
источник

AN

Alexander Nozik in Programming Offtop
Ilmir
Ога. Ты просил типобезопасности, получи типобезопасность. Или сформулируй задачу конкретнее.
Он хотел ныть. @happy_bracket если ты будешь делать HList большк, чем на 21 элемент, код ревью не пройдет
источник

AA

Andrey Akimov in Programming Offtop
Ilmir
Можно без тьюринг полноты же:
interface Typelist<in T, out U>

interface Piano

interface O: Piano
interface S<T: Piano>: Piano

typealias One = S<O>
typealias Two = S<One>
typealias Three = S<Two>

@JvmName("len1")
fun <TL: Typelist<*, Typelist<*, Typelist<*, Nothing>>>> TL.length() = object : Three
@JvmName("len2")
fun <TL: Typelist<*, Typelist<*, Nothing>>> TL.length() = object : Two
@JvmName("len3")
fun <TL: Typelist<*, Nothing>> TL.length() = object : One
               
@JvmName("contains1")
fun <T, TL: Typelist<T, *>> TL.contains() = 1
@JvmName("contains2")
fun <T, TL: Typelist<*, Typelist<T, *>>> TL.contains() = 1
@JvmName("contains3")
fun <T, TL: Typelist<*, Typelist<*, Typelist<T, Nothing>>>> TL.contains() = 1

typealias A = Typelist<Any, Nothing>
typealias B = Typelist<Any, Typelist<Any, Nothing>>
typealias Integral = Typelist<Int, Typelist<Short, Typelist<Long, Nothing>>>

inline fun <reified T> Function<T>.eq() = 1

val ALEN = A::length.eq<One>()
val BLEN = B::length.eq<Two>()
val ILEN = Integral::length.eq<Three>()

// Compiler error
// val ILEN2 = Integral::length.eq<Two>()

val LI = (object : Integral {}).contains<Long, Integral>()
val SI = (object : Integral {}).contains<Short, Integral>()

// Compiler error
// val StrI = (object : Integral {}).contains<String, Integral>()
чё это вообще такое? Это норм, что я вообще не понимаю, чё тут написано?)
источник

AN

Alexander Nozik in Programming Offtop
Andrey Akimov
чё это вообще такое? Это норм, что я вообще не понимаю, чё тут написано?)
Линкед лист на типах
источник

I

Ilmir in Programming Offtop
Andrey Akimov
чё это вообще такое? Это норм, что я вообще не понимаю, чё тут написано?)
Это http://loki-lib.sourceforge.net/html/a00681.html адаптированный под ограничения системы типов Котлина.
источник

(

( in Programming Offtop
канонический хлист (а также хсет и хмап) индуктивно определяются из двух базовых конструкторов, а все операции без "проблемы 22" определены поверх
источник

(

( in Programming Offtop
Кароче да, хлист это тупл неограниченной длины, где не приходится копипастить всякое говно
источник

(

( in Programming Offtop
Alexander Nozik
Он хотел ныть. @happy_bracket если ты будешь делать HList большк, чем на 21 элемент, код ревью не пройдет
ему необязательно даже появляться на экране, инференс же для чего
источник