Search code examples
scalatraitsshapeless

Scala: Shapeless Generic with universal traits


I am trying to get hold of a shapeless Generic for a case class with a marker trait, like this:

case class X(a:String)

trait UniversalTrait extends Any {}

object MyApp extends App {
  val ok = Generic[X]
  val notOk = Generic[X with UniversalTrait]
}

It doesn't compile, with error could not find implicit value for parameter gen: shapeless.Generic[X with UniversalTrait] in the notOk line. Why is that? And can something be done?

Side note: I thought that it might be something to do with from not being able to add the marker trait to the returned instance, so I attempted fixing things by adding this:

object UniversalTrait {
  implicit def genGeneric[P1<:Product with UniversalTrait,P2<:Product,L<:HList]
                 (implicit constraint: P1 =:= P2 with UniversalTrait,
                           underlying: Generic.Aux[P2,L]): Generic.Aux[P1,L] = new Generic[P1]{
        type Repr=L
        def to(t: P1): Repr = underlying.to(t)
        def from(r: Repr): P1 = underlying.from(r).asInstanceOf[P1]
  }
}

However, the error remains.


Solution

  • Deriving works for algebraic data types only. That is a (sealed) trait and case classes (objects) extending the trait.

    case class X(a:String) extends UniversalTrait
    
    sealed trait UniversalTrait extends Any {}
    
    val ok = Generic[X]