首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Shapeless泛型Repr类型操作

Shapeless泛型Repr类型操作
EN

Stack Overflow用户
提问于 2019-03-15 00:32:49
回答 1查看 307关注 0票数 1

如果我有一个方法,比如:

代码语言:javascript
复制
        def f[T: Generic, U: Generic](t: T): U

Generic[T].to(t)返回类型Generic[T]#Repr,我假设它是某种类型HList的类型别名。

是否可以从HList中选择成员并构建另一个HList,我可以确信编译器是Generic[U]#Repr类型的,然后可以使用该类型通过Generic[U].from(myNewHList)创建U的实例

我尝试了许多方法,但似乎都在兜圈子。

EN

回答 1

Stack Overflow用户

发布于 2019-03-15 02:49:55

在Shapeless中做这样的事情时,最好的地方是在shapeless.ops类型类中。在这种情况下,因为您知道第二个类是第一个类的严格子集,所以Intersection就足以获得您想要的东西。您需要将其设置为一个类型类,以便可以传入输入和输出类型,并让编译器推断中间内容。

代码语言:javascript
复制
trait Converter[A,B] {
  def convert(a: A): B
}
object Converter {
  def apply[A,B](implicit converter: Converter[A,B]) = converter

  implicit def genericConverter[A, B, ARepr <: HList, BRepr <: HList](
    implicit
    genA: Generic.Aux[A,ARepr],
    genB: Generic.Aux[B,BRepr],
    intersection: shapeless.ops.hlist.Intersection.Aux[ARepr,BRepr,BRepr]
  ): Converter[A,B] = 
    new Converter[A,B]{def convert(a: A): B = genB.from(intersection(genA.to(a)))}
}

它的用法如下:

代码语言:javascript
复制
case class Foo(a: Int, b: Int, c: String)
case class Bar(a: Int, c: String)
val foo = Foo(1,2,"Three")
val bar: Bar = Converter[Foo, Bar].convert(foo)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55167713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档