Предположим, что у меня есть контейнер-маркерстранно влияние неявной Mapper на неявное Mapped параметра
case class TypedString[T](value: String)
и частичная функция трик
abstract class PartFunc[Actual <: HList] {
val poly: Poly
def apply[L1 <: HList](l: L1)(implicit
mapped: Mapped.Aux[Actual, TypedString, L1],
mapper: Mapper[poly.type, L1]): L1 = l
}
Поли для Mapper
object f extends (TypedString ~>> String) {
def apply[T](s : TypedString[T]) = s.value
}
и результат метода
def func[Actual <: HList] = new PartFunc[Actual] {
val poly = f
}
Пример использования:
func[
Int :: String :: HNil
](TypedString[Int]("42") :: TypedString[String]("hello") :: HNil)
Этот код не во время компиляции, потому что компилятор не может найти Mapped
неявного параметра:
could not find implicit value for parameter mapped:
shapeless.ops.hlist.Mapped[shapeless.::[Int,shapeless.::[String,shapeless.HNil]],nottogether.MapperTest.TypedString]{type Out = shapeless.::[nottogether.MapperTest.TypedString[Int],shapeless.::[nottogether.MapperTest.TypedString[String],shapeless.HNil]]}
](TypedString[Int]("42") :: TypedString[String]("hello") :: HNil)
Но если убрать Mapper
неявный параметр из PartFunc.apply(...)
подписей все работает отлично. Поэтому я понятия не имею, почему и как влияет Mapper
на Mapped
.
Я задал этот вопрос в бесформенной комнате без ответа. Спасибо за Вашу поддержку. Какую книгу или статьи вы предлагаете прочитать, чтобы быть более знакомыми с типами scala? –