Что такое определение типа для определения 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
,