如何解决隐含和召唤有什么区别?
在 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
产生错误
cannot reduce inline match with
scrutinee: compiletime.erasedValue[App.ValueOfs] : App.ValueOfs
patterns : case _:EmptyTuple
case _:*:[t @ _,ts @ _]
但是用 implicitly[Mirror.Of[A]]
替换 summon[Mirror.Of[A]]
编译正常。
在这种情况下和一般情况下,summon
与 implicitly
的微妙之处是什么?
解决方法
给定
case class A(i: Int,s: String)
我们可以看到 summon
和 implicitly
返回相同的运行时值
assert(implicitly[Mirror.Of[A]] eq summon[Mirror.Of[A]])
但它们有不同的编译时类型
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))
}.
summon
返回的更具体,但我不确定这如何/为什么适用于问题中的案例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。