Что такое определение типа для определения Nat в бесформенном?

Это определение Nat в упаковке shapeless:

   trait Nat {
     type N <: Nat
   }

   case class Succ[P <: Nat]() extends Nat {
     type N = Succ[P]
   }

   class _0 extends Nat with Serializable {
     type N = _0
   }

Каковы type декларации для? После удаления мне кажется, что определение работает одинаково хорошо.

1 ответ

Они используются где Nat является целевым типом неявного преобразования из литерала Int... см. здесь, например, в определении Int метод индексации для HList,

def at(n : Nat)(implicit at : At[L, n.N]) : at.Out = ...

Здесь подразумевается, что метод вызывается с литералом Int аргумент,

(23 :: "foo" :: true :: HNil).at(1)

Аргумент преобразуется в Nat неявным макросом, который может проверить дерево аргументов времени компиляции и создать соответствующий Nat значение. Затем мы можем обратиться к типу члена N из n и использовать его в качестве индекса для At класс типа, который извлекает нужный элемент из HList,

Другие вопросы по тегам