holbech
holbech

Reputation: 573

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.

Upvotes: 3

Views: 517

Answers (1)

Dmytro Mitin
Dmytro Mitin

Reputation: 51658

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]

Upvotes: 4

Related Questions