如何隐式找出无形 HList 头部的类型
How to implicitly figure out the type at the head of a shapeless HList
假设我有以下内容:
case class TestField(value: String)
case class TestField2(value: String)
implicit class ProductExtensions[T <: Product](val value T) extends AnyVal {
def mapTo[R <: Product](implicit tGen: Generic.Aux[T, String :: HNil], rGen: Generic.Aux[R, String :: HNil]: R = ???
}
val testField2 = TestField("my value").mapTo[TestField2]
// TestField2("my value")
我可以 "genersize" mapTo
函数在不指定类型的情况下用于 String
以外的类型吗?
注意 TestField
和 TestField2
实现 AnyVal(我也不希望他们这样做),所以我不能使用 Unwrapped
。
编辑
@Dmytro_Mitin 答案在我上面的示例中有效,但是如果我将示例扩展到这个:
implicit class ProductExtensions[T <: Product](val value T) extends AnyVal {
def mapTo[R <: Product](implicit tGen: Generic.Aux[T, String :: HNil], rGen: Generic.Aux[R, String :: HNil], o: OtherImplicit[String]): R = ???
}
...所以我有点想找这个工作(但它没有):
implicit class ProductExtensions[T <: Product, U](val value T) extends AnyVal {
def mapTo[R <: Product](implicit tGen: Generic.Aux[T, U :: HNil], rGen: Generic.Aux[R, U :: HNil], o: OtherImplicit[U]): R = ???
}
有什么想法吗?
这里是通用版
implicit class ProductExtensions[T <: Product, L <: HList](val value: T) extends AnyVal {
def mapTo[R <: Product](implicit tGen: Generic.Aux[T, L], rGen: Generic.Aux[R, L]): R = rGen.from(tGen.to(value))
}
类型宇航员的无形指南。 6.3 案例研究:案例 class 迁移 https://books.underscore.io/shapeless-guide/shapeless-guide.html#sec:ops:migration
新版本
import shapeless.ops.hlist.IsHCons
implicit class ProductExtensions[T <: Product, L <: HList, U, L1 <: HList](val value: T) extends AnyVal {
def mapTo[R <: Product](implicit
tGen: Generic.Aux[T, L],
rGen: Generic.Aux[R, L],
isHCons: IsHCons.Aux[L, U, L1],
o: OtherImplicit[U]
): R = rGen.from(tGen.to(value))
}
4.3 链接依赖函数https://books.underscore.io/shapeless-guide/shapeless-guide.html#sec:type-level-programming:chaining
Scala shapeless Generic.Aux implicit parameter not found in unapply
假设我有以下内容:
case class TestField(value: String)
case class TestField2(value: String)
implicit class ProductExtensions[T <: Product](val value T) extends AnyVal {
def mapTo[R <: Product](implicit tGen: Generic.Aux[T, String :: HNil], rGen: Generic.Aux[R, String :: HNil]: R = ???
}
val testField2 = TestField("my value").mapTo[TestField2]
// TestField2("my value")
我可以 "genersize" mapTo
函数在不指定类型的情况下用于 String
以外的类型吗?
注意 TestField
和 TestField2
实现 AnyVal(我也不希望他们这样做),所以我不能使用 Unwrapped
。
编辑
@Dmytro_Mitin 答案在我上面的示例中有效,但是如果我将示例扩展到这个:
implicit class ProductExtensions[T <: Product](val value T) extends AnyVal {
def mapTo[R <: Product](implicit tGen: Generic.Aux[T, String :: HNil], rGen: Generic.Aux[R, String :: HNil], o: OtherImplicit[String]): R = ???
}
...所以我有点想找这个工作(但它没有):
implicit class ProductExtensions[T <: Product, U](val value T) extends AnyVal {
def mapTo[R <: Product](implicit tGen: Generic.Aux[T, U :: HNil], rGen: Generic.Aux[R, U :: HNil], o: OtherImplicit[U]): R = ???
}
有什么想法吗?
这里是通用版
implicit class ProductExtensions[T <: Product, L <: HList](val value: T) extends AnyVal {
def mapTo[R <: Product](implicit tGen: Generic.Aux[T, L], rGen: Generic.Aux[R, L]): R = rGen.from(tGen.to(value))
}
类型宇航员的无形指南。 6.3 案例研究:案例 class 迁移 https://books.underscore.io/shapeless-guide/shapeless-guide.html#sec:ops:migration
新版本
import shapeless.ops.hlist.IsHCons
implicit class ProductExtensions[T <: Product, L <: HList, U, L1 <: HList](val value: T) extends AnyVal {
def mapTo[R <: Product](implicit
tGen: Generic.Aux[T, L],
rGen: Generic.Aux[R, L],
isHCons: IsHCons.Aux[L, U, L1],
o: OtherImplicit[U]
): R = rGen.from(tGen.to(value))
}
4.3 链接依赖函数https://books.underscore.io/shapeless-guide/shapeless-guide.html#sec:type-level-programming:chaining
Scala shapeless Generic.Aux implicit parameter not found in unapply