【发布时间】:2022-08-14 00:00:25
【问题描述】:
一般来说,我对 Scala 相当陌生,尤其是 Scala 3,我正在尝试编写一些代码,在将值传递给另一个库之前对它们进行透明编码+解码。
基本上,我需要将一组类型(如Ints)映射到底层库中的对应对象。我编写的代码过于冗长,无法在此处完整复制,但这里有一个最小示例来演示这种事情,使用更高种类的 Encoder 类型,它将编码值封装成依赖于值的类型\ ' 原始类型:
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]]
}
我还需要能够编写处理特定类型的Value 并且具有\'concrete\' 返回类型的函数。像这样:
def doStuff(v1: Value[Int]): String = {
v1.encoder.encode(v1.v)
}
然而,即使在这种情况下v1.codec.encode 确实返回了String,我得到一个错误:
-- [E007] Type Mismatch Error: -------------------------------------------------
2 | v1.encoder.encode(v1.v)
| ^^^^^^^^^^^^^^^^^^^^^^^
| Found: v1.encoder.U
| Required: String
我可以做些什么来解决这个错误?真的很感谢任何可以帮助新手的建议????
-
你怎么知道回报是
String?顺便说一句,整个设计感觉很尴尬。 -
因为
Encoder[Int].U是String。 -
您假设这将是唯一的,编译器不会。
-
感谢您的回复。我假设将是唯一的一个,对不起?
-
encoder的类型是Encoder[Int]。句号。Encoder存在哪些子类目前无关紧要(而givens 只是另一个名称的子类),编译器不会去寻找它们。它只知道Encoder[int]有一个名为U的字段,其类型是“字面上的任何东西”。我们无法推断出任何关于它的信息。