I'm observing a very strange type error with shapeless.everywhere
. Consider the following ammonite script which loads fine with load.module
:
load.ivy("com.chuusai" %% "shapeless" % "2.3.0")
@
import shapeless._
import poly._
final case class Person(name: Person.Name, age: Person.Age)
object Person {
final case class Name(value: String) extends AnyVal
final case class Age(value: Int) extends AnyVal
}
def happyBirthday(person: Person, howManyYearsPast: Int): Person = {
object incAge extends ->((age: Int) => age + howManyYearsPast)
// THE MAGIC VAL
val oldPerson = everywhere(incAge)(person)
oldPerson
}
val john = Person(Person.Name("John Doe"), Person.Age(42))
val oldJohn = happyBirthday(john, 30)
Now if I try to “inline” the MAGIC VAL
in this script, i.e. replace the val
with just everywhere(incAge)(person)
, I get the following type error out of nowhere:
Main.scala:50: type mismatch;
found : person.type (with underlying type cachef6f1545a8d4dc31cb54d9957675f0559.Person)
required: shapeless.poly.Case[_1.type,shapeless.HNil]{type Result = ?} where val _1: shapeless.EverywhereAux[incAge.type]
everywhere(incAge)(person)
WAT?
I guess there's scalac's black magic implicit resolution to blame, but can't me no sense of what's going on here. It'd be great (and definitely somewhat enlightening to me) if someone could unravel this mystery to me.
Thanks