【发布时间】:2016-05-22 18:50:26
【问题描述】:
我目前开始尝试使用 Shapeless。我的第一次尝试是下面的代码示例。 Shapeless 版本是 2.3.0,Scala 版本是 2.11.7:
import org.scalatest._
import shapeless._
sealed trait Dog {
def favoriteFood: String
}
sealed trait Cat{
def isCute: Boolean
}
sealed trait Green
sealed trait Blue[G <: Green]{
def makeGreen(): G = {
val blueGen = LabelledGeneric[this.type]
val greenGen = LabelledGeneric[G]
val blue = blueGen.to(this)
val green = greenGen.from(blue)
green
}
}
case class BlueDog(override val favoriteFood: String) extends Dog with Blue[GreenDog]
case class GreenDog(override val favoriteFood: String) extends Dog with Green
case class GreenCat(override val isCute: Boolean) extends Cat with Green
case class BlueCat(override val isCute: Boolean) extends Cat with Blue[GreenCat]
class ShapelessExperimentsTest extends FlatSpec with Matchers {
"Make green" should "work" in {
val blueDog = new BlueDog("Bones")
val greenDog: GreenDog = blueDog.makeGreen
assert(greenDog.favoriteFood == "Bones")
val blueCat = new BlueCat(true)
val greenCat: GreenCat = blueCat.makeGreen
assert(greenCat.isCute)
}
}
此代码无法编译,因为我没有为 LabelledGenerics 的隐式参数 lgen 提供值。因此编译错误是
...ShapelessExperimentsTest.scala:16: could not find implicit value for parameter lgen: shapeless.LabelledGeneric[Blue.this.type]
和
...ShapelessExperimentsTest.scala:17: could not find implicit value for parameter lgen: shapeless.LabelledGeneric[G]
我的问题是我找不到正确的方法来提供这些隐式以使示例工作。谁能帮我解决这个问题?
【问题讨论】:
-
我不认为 LabelledGeneric 被设计或不应该用于抽象类型或单例类型。
标签: scala generic-programming shapeless