Длина пареметра типа HList в пересчете на Nat
Предположим, у меня есть метод без параметров. Как я могу определить длину параметра типа?
def func[T <: HList]: Nat = {
// some magic
}
1 ответ
Ты можешь использовать ops.hlist.Length
операция для расчета Nat
длина HList
,
Кроме того, как непрозрачный Nat
не очень полезно, потому что вы теряете всю информацию уровня типа о фактическом числе. Таким образом, вы должны получить точное Nat
введите из функции:
import shapeless._
import shapeless.ops.hlist.Length
def func[T <: HList](implicit len: Length[T]): len.Out = len()
Использование:
scala> natLen[Int :: String :: HNil]
res1: shapeless.Succ[shapeless.Succ[shapeless._0]] = Succ()
Получение длины как Int
кажется более сложным. Кажется, вы не можете использовать ops.nat.ToInt
потому что это потребовало бы N <: Nat
введите параметр и в основном сделайте его бесполезным:
def uselessIntLen[T <: HList, N <: Nat](implicit
len: Length.Aux[T, N],
toInt: ToInt[N]
): Int = toInt()
Я нашел следующий обходной путь, используя HKernel
(конечно, также можно написать новый класс типов IntLength
вручную). Может быть, кто-то может помочь с более прямым встроенным методом:
import shapeless.ops.hlist.HKernelAux
def intLen[T <: HList](implicit ker: HKernelAux[T]): Int = ker().length
Использование:
scala> intLen[Int :: String :: HNil]
res2: Int = 2