kag*_*ag0 6 scala implicit scala-3
在 Scala 3 中summon似乎和旧的implicitly. 但是当我们深入研究实际例子时,我们发现情况并非如此。例如
case class A(i: Int, s: String)
val mirror = implicitly[Mirror.Of[A]]
type ValueOfs = Tuple.Map[mirror.MirroredElemLabels, ValueOf]
val valueOfs = summonAll[ValueOfs]
def values(t: Tuple): Tuple = t match
case (h: ValueOf[_]) *: t1 => h.value *: values(t1)
case EmptyTuple => EmptyTuple
Run Code Online (Sandbox Code Playgroud)
产生错误
cannot reduce inline match with
scrutinee: compiletime.erasedValue[App.ValueOfs] : App.ValueOfs
patterns : case _:EmptyTuple
case _:*:[t @ _, ts @ _]
Run Code Online (Sandbox Code Playgroud)
但是替换implicitly[Mirror.Of[A]]为summon[Mirror.Of[A]]编译很好。
在这种情况下和一般情况下summonvs的微妙之处是什么implicitly?
给定
case class A(i: Int, s: String)
Run Code Online (Sandbox Code Playgroud)
我们可以看到summon并implicitly返回相同的运行时值
assert(implicitly[Mirror.Of[A]] eq summon[Mirror.Of[A]])
Run Code Online (Sandbox Code Playgroud)
但它们有不同的编译时类型
def fun[A,B]( a: A, b: B )( implicit ev: A =:= B ) = ???
fun(implicitly[Mirror.Of[A]], summon[Mirror.Of[A]])
Cannot prove that deriving.Mirror.Of[Worksheet.A] =:= (
deriving.Mirror{
MirroredType = Worksheet.A; MirroredMonoType = Worksheet.A;
MirroredElemTypes <: Tuple
}
&
scala.deriving.Mirror.Product{
MirroredMonoType = Worksheet.A; MirroredType = Worksheet.A;
MirroredLabel = ("A" : String)
}
){
MirroredElemTypes = (Int, String);
MirroredElemLabels = (("i" : String), ("s" : String))
}.
Run Code Online (Sandbox Code Playgroud)
返回的summon更具体,尽管我不确定这如何/为什么适用于问题中的情况。