Dr. Friedrich
Я же эти x y ни спаттерн матчить, ничо вообще с ними сделать-то не могу
Doge
Снова непонятно
https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#extensible-records Вот такие штуки будет проще реализовать.
Romɑn
def concat[X, Y](x: X, y: Y): Concat[X, Y]
@DogeShibu вот хороший вопрос для понимания
Dr. Friedrich
Наверное, рекурсивно надо реализовывать
Doge
@DogeShibu вот хороший вопрос для понимания
Надо чуть по другому реализовать
Romɑn
https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#extensible-records Вот такие штуки будет проще реализовать.
это был бы хороший пример, если бы шейплесс был нужен но давай для понимания зачем шейплесс нужен, ответим на вопрос форневера
Dr. Friedrich
Это круто, что можно иметь типизированную мапку в компилтайме
Dr. Friedrich
И это настоящая магия
Dr. Friedrich
Но причём тут match types?
Doge
Но причём тут match types?
В их реализации подобного рода трюки активно используются. И это поможет их код упростить
Romɑn
амбасадор из тебя так себе = / отсутствие скобочек и я продать смогу = ((
Dr. Friedrich
Можно, наверное, сказал, что тип функции book в примере является match type вида type book[K: String](key: K) = key match { "author" => String "title" => String "id" => Int }
Dr. Friedrich
Можно, наверное, сказал, что тип функции book в примере является match type вида type book[K: String](key: K) = key match { "author" => String "title" => String "id" => Int }
Но я всё ещё не уверен, что это нам что-то существенное даёт. Ну ок, затипизировали функцию, а реализуем мы её как?
Romɑn
тут говорят матч тайп юзается
Romɑn
но я ничего не понял
Doge
Но я всё ещё не уверен, что это нам что-то существенное даёт. Ну ок, затипизировали функцию, а реализуем мы её как?
https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/syntax/hlists.scala Часть местных имплиситов, которые используются в духе ...(implicit smth: Something[...]): smth.Out Можно заменить целиком на матч типы
Dr. Friedrich
Так, у нас есть экстеншен метод
Dr. Friedrich
Для типа HList
Dr. Friedrich
Не, блин, ни хера не понимаю
Dr. Friedrich
В смысле, код кажется понятным, но при чём тут match types?
Romɑn
А тут type NodeExtractor был назван ф-цией
Dr. Friedrich
Или это не экстеншен даже?
Dr. Friedrich
А тут type NodeExtractor был назван ф-цией
Погодь, это же просто тип функции
Romɑn
Погодь, это же просто тип функции
да вот я потом тоже понял
Romɑn
я прост подумаол что Concat выше это тоже тип ф-ции
Dr. Friedrich
Это функция на типах
Dr. Friedrich
Любой генерик, в сущности, тоже функция на типах
Dr. Friedrich
Ну то есть конструктор — принимает тип и возвращает инстанс генерика
Doge
В смысле, код кажется понятным, но при чём тут match types?
Смотри, пример: Там есть метод length, он возращается length.Out Реализуется через такую имплисит хрень (см. Length): https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/ops/hlists.scala Теперь можно будет сделать через match типы
Dr. Friedrich
А match type всего лишь расширяет эту концепцию — он может разрешиться в уже существующий
Doge
И чуть упростить такой код
Dr. Friedrich
Там очень много слова length
Doge
Тут я уже совершенно ни хрена не понял
Это аналог матч типов на имплиситах.
Dr. Friedrich
Я хочу понять, как их использовать.
Dr. Friedrich
Пока что я в этом не преуспел.
Dr. Friedrich
И я не вижу, как твой пример связан с match types
Dr. Friedrich
Вообще что в нём с чем матчится-то?
Dr. Friedrich
Я понимаю, что он на старой скале написан, и match type в нём нету
Dr. Friedrich
Но я не вижу аналога, мне вообще непонятно, что тут делается.
Doge
Будет понятнее
Dr. Friedrich
Окей!
Romɑn
Сейчас в поезд сяду, набросаю пример
Быстрей! Быстрей! ты с фбай?
Dr. Friedrich
Я, вроде, даже примерно понял, что этот код с Length делает
Dr. Friedrich
Он считает длину HList'а
Dr. Friedrich
Я вижу ноль, вижу Succ[N]
Dr. Friedrich
Вижу sn.value, которое в инт превращает длину, наверное (?)
Dr. Friedrich
Но общий смысл кода от меня ускользает.
Dr. Friedrich
Однако, мб это будет хорошим примером
Dr. Friedrich
Давайте количество элементов в тупле посчитаем
Dr. Friedrich
нееет!
Ну хоть что-то, что мы сможем использовать 🤷‍♂️
Romɑn
там и так понятно что 2
Romɑn
= )
Dr. Friedrich
Ну, если у тебя Pair[Int, Pair[Int, Pair[Int, Nil]]] — должно вернуться три
Romɑn
теперь у нас Combimne
Romɑn
и получили нормальную туплю
Dr. Friedrich
и получили нормальную туплю
У нас там не норм тупля, обрати внимание
Romɑn
как кол-во раз написаного слова Piar получить в рантайме я хз
Dr. Friedrich
Вариадиков-то всё ещё нету, кажется :(
Romɑn
Вариадиков-то всё ещё нету, кажется :(
не забывай с кем разговариаешь! Я не знаю что такое вариадик
Dr. Friedrich
Там Concat соединяет списки из вот этих вот пар
Romɑn
крайности одни)
Dr. Friedrich
https://en.cppreference.com/w/cpp/language/parameter_pack смотри, у плюсоводов примеры хорошие
Dr. Friedrich
Практичные
Romɑn
ок у меня вариадики не мапятся на то что в скале
Dr. Friedrich
Смысл в том, чтобы писать шаблоны с неограниченным количеством аргументов