Стандартный способ отладки последствий - попытаться разрешить их вручную (явным образом) и посмотреть на ошибки компиляции.
emptyList[OL](natLength[OL])(
implicitly[*->*[Option]#λ[Option[Double] :: Option[Int] :: Option[String] :: HNil]],
implicitly[Fill.Aux[_3, None.type, None.type :: None.type :: None.type :: HNil]],
)
производит
Error: type mismatch;
found : shapeless.ops.hlist.Fill[shapeless.nat._3,None.type]{type Out = None.type :: None.type :: None.type :: shapeless.HNil}
(which expands to) shapeless.ops.hlist.Fill[shapeless.Succ[shapeless.Succ[shapeless.Succ[shapeless._0]]],None.type]{type Out = None.type :: None.type :: None.type :: shapeless.HNil}
required: shapeless.ops.hlist.Fill[shapeless.Succ[shapeless.Succ[shapeless.Succ[shapeless._0]]],None.type]{type Out = Option[Double] :: Option[Int] :: Option[String] :: shapeless.HNil}
implicitly[Fill.Aux[_3, None.type, None.type :: None.type :: None.type :: HNil]],
Что должно быть T
вdef emptyList[T <: HList: *->*[Option]#λ]...
? Это Option[Double] :: Option[Int] :: Option[String] :: HNil
? Тогда почему вы запрашиваете неявный Fill.Aux[length.N, None.type, T]
с Out
-типом того же T
, тогда как он должен быть None.type :: None.type :: None.type :: HNil
.
Попробуйте
def emptyList(length: Nat)(
implicit fill: Fill[length.N, None.type]
): fill.Out = {
HList.fill(length)(None)
}
emptyList(natLength[OL]) //None :: None :: None :: HNil
*->*[Option]#λ
контекст связан в def natLength
.