Home > Blockchain >  Mixing dependent types and 'concrete' types in Scala 3
Mixing dependent types and 'concrete' types in Scala 3

Time:08-14

I'm fairly new to Scala in general, and Scala 3 in particular, and I'm trying to write some code that deals with transparently encoding decoding values before they are passed to another library.

Basically, I need to map a set of types like Ints to a counterpart in the underlying library. The code I've written is too verbose to replicate here in full, but here's a minimal example demonstrating the kind of thing, using a higher-kinded Encoder type that encapsulates encoding values into types which depend on the values' original types:

trait Encoder[T] {
    type U
    def encode(v: T): U
}

object Encoder {
    given Encoder[Int] with {
        override type U = String

        override def encode(v: Int): String = v.toString
    }
}

case class Value[T : Encoder](v: T) {
    val encoder: Encoder[T] = summon[Encoder[T]]
}

I also need to be able to write functions that deal with specific types of Value and which have 'concrete' return types. Like this:

def doStuff(v1: Value[Int]): String = {
    v1.encoder.encode(v1.v)
}

However, even though in this case v1.codec.encode does indeed return a String, I get an error:

-- [E007] Type Mismatch Error: -------------------------------------------------
2 |    v1.encoder.encode(v1.v)
  |    ^^^^^^^^^^^^^^^^^^^^^^^
  |    Found:    v1.encoder.U
  |    Required: String

What can I do differently to solve this error? Really appreciate any pointers to help a newbie out

  • Related