私は現在Shapelessで実験を始めました。私の最初の試みは次のコード例でした。型崩れのバージョンは2.3.0で、Scalaのバージョン2.11.7:私はLabelledGenericsためlgen暗黙のパラメータの値を提供しなかったので、シェイプレスで一般的な型変換
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)
}
}
は、このコードはいえコンパイルされません。コンパイルエラーは、したがって、私の問題は、私は例を動作させるために、これらの暗黙を提供するための正しい方法を見つけることができなかったということです
...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]
です。誰もこれで私を助けることができますか?関数の本体で
val blueGen = LabelledGeneric[this.type]
val greenGen = LabelledGeneric[G]
コンパイルされません:
LabelledGenericは抽象型やシングルトン型で動作するように設計されているとは思われません。 – pedrofurla