Длина пареметра типа 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
Другие вопросы по тегам