In Scala 3, how to summon a constant from its type?

77 Views Asked by At

assuming that I want to summon a constant 3 from its type 3.

In Scala 2, this can be easily done with shapeless Witness:

val w = implicitly[Witness[3]]
w.value

this has no counterpart in Scala 3, I've tried the following:

  val v2 = summon[3]

  val v3 = inline constValue[3]

and none of them appears to be working. What's the canonical way to implement this? And what can be done to make it cross-compilable between Scala 3 & 2.13?

1

There are 1 best solutions below

1
Dmytro Mitin On BEST ANSWER

In Scala 3 use scala.compiletime.constValue (documented here)

constValue[3]

or good old Scala 2 type class scala.ValueOf

valueOf[3]  // from scala.runtime.stdLibPatches.Predef

https://scastie.scala-lang.org/DmytroMitin/puPRyLUgQmaVfXslE7Di7Q/8

implicitly[ValueOf[3]].value should be cross-compilable between Scala 3 & 2.13 as long as implicitly exists in Scala 3.

summon[3] can't be correct because 3 is not an implicit.