0

我正在尝试shapeless并正在尝试了解GenericCoproducts。这是我尝试过的:

object ShapelessExperiments {
    final case class Test1()
    final case class Test2()
    final case class Test3()

    type Test = Test1 :+: Test2 :+: Test3 :+: CNil

    val t1: Test = Inr(Inl(Test2()))  //fine
    val t2: Test = Generic[Test].to(Test2())  //compile error
}

我希望val t2与 完全相同val t1,但不幸的是它甚至没有编译:

Error:(13, 25) could not find implicit value for parameter gen: shapeless.Generic[com.test.ShapelessExperiments.Test]
  val t2: Test = Generic[Test].to(Test2())

Error:(13, 25) not enough arguments for method apply: (implicit gen: shapeless.Generic[com.test.ShapelessExperiments.Test])shapeless.Generic.Aux[com.test.ShapelessExperiments.Test,gen.Repr] in object Generic.
Unspecified value parameter gen.
  val t2: Test = Generic[Test].to(Test2())

这个错误确实不是很清楚,对我有帮助。你能解释一下最后一个案例出了什么问题吗?

4

1 回答 1

3

我想你正在寻找Inject

import shapeless._
import shapeless.ops.coproduct.Inject // for converter object
import shapeless.syntax.inject._ // for nice syntax

object ShapelessExperiments extends App {
    final case class Test1()
    final case class Test2()
    final case class Test3()

    type Test = Test1 :+: Test2 :+: Test3 :+: CNil

    val t1: Test = Inr(Inl(Test2()))  //fine
    val t2: Test = Inject[Test, Test2].apply(Test2())
    val t3: Test = Test2().inject[Test]
    println(t1 == t2) // true
    println(t1 == t3) // true 
}

Generic[A]目的是不同的:它说它A是同构的(可以相互转换,没有任何数据丢失)到某种类型BB通常是一个HList(如果A是案例类)或一个Coproduct(如果A是密封的特征)。

A当is anHList或 a Coproductitself (source)时,这些实例不可用。

于 2019-12-06T12:22:55.643 回答