Dr. Friedrich
Я же эти x y ни спаттерн матчить, ничо вообще с ними сделать-то не могу
Doge
Снова непонятно
https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#extensible-records
Вот такие штуки будет проще реализовать.
Dr. Friedrich
Наверное, рекурсивно надо реализовывать
Doge
Romɑn
Dr. Friedrich
Dr. Friedrich
Это круто, что можно иметь типизированную мапку в компилтайме
Dr. Friedrich
И это настоящая магия
Romɑn
Dr. Friedrich
Но причём тут match types?
Romɑn
Romɑn
амбасадор из тебя так себе = /
отсутствие скобочек и я продать смогу = ((
Dr. Friedrich
Можно, наверное, сказал, что тип функции book в примере является match type вида
type book[K: String](key: K) = key match {
"author" => String
"title" => String
"id" => Int
}
Romɑn
Dr. Friedrich
Romɑn
Romɑn
Romɑn
тут говорят матч тайп юзается
Romɑn
но я ничего не понял
Dr. Friedrich
Так, у нас есть экстеншен метод
Dr. Friedrich
Для типа HList
Dr. Friedrich
Не, блин, ни хера не понимаю
Dr. Friedrich
В смысле, код кажется понятным, но при чём тут match types?
Romɑn
А тут type NodeExtractor был назван ф-цией
Dr. Friedrich
Или это не экстеншен даже?
Dr. Friedrich
Romɑn
Romɑn
я прост подумаол что Concat выше это тоже тип ф-ции
Dr. Friedrich
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
Dr. Friedrich
Там очень много слова length
Doge
Dr. Friedrich
Dr. Friedrich
Я хочу понять, как их использовать.
Dr. Friedrich
Пока что я в этом не преуспел.
Dr. Friedrich
И я не вижу, как твой пример связан с match types
Dr. Friedrich
Вообще что в нём с чем матчится-то?
Dr. Friedrich
Я понимаю, что он на старой скале написан, и match type в нём нету
Dr. Friedrich
Но я не вижу аналога, мне вообще непонятно, что тут делается.
Doge
Doge
Будет понятнее
Dr. Friedrich
Окей!
Romɑn
Dr. Friedrich
Я, вроде, даже примерно понял, что этот код с Length делает
Dr. Friedrich
Он считает длину HList'а
Dr. Friedrich
Я вижу ноль, вижу Succ[N]
Dr. Friedrich
Вижу sn.value, которое в инт превращает длину, наверное (?)
Dr. Friedrich
Но общий смысл кода от меня ускользает.
Romɑn
Dr. Friedrich
Однако, мб это будет хорошим примером
Dr. Friedrich
Давайте количество элементов в тупле посчитаем
Romɑn
Dr. Friedrich
нееет!
Ну хоть что-то, что мы сможем использовать 🤷♂️
Romɑn
там и так понятно что 2
Romɑn
= )
Dr. Friedrich
Dr. Friedrich
Ну, если у тебя Pair[Int, Pair[Int, Pair[Int, Nil]]] — должно вернуться три
Romɑn
Romɑn
теперь у нас Combimne
Romɑn
и получили нормальную туплю
Romɑn
как кол-во раз написаного слова Piar получить в рантайме я хз
Dr. Friedrich
Вариадиков-то всё ещё нету, кажется :(
Dr. Friedrich
Там Concat соединяет списки из вот этих вот пар
Dr. Friedrich
Romɑn
крайности одни)
Dr. Friedrich
https://en.cppreference.com/w/cpp/language/parameter_pack смотри, у плюсоводов примеры хорошие
Dr. Friedrich
Практичные
Romɑn
ок
у меня вариадики не мапятся на то что в скале
Dr. Friedrich
Смысл в том, чтобы писать шаблоны с неограниченным количеством аргументов