【发布时间】:2021-09-23 00:12:32
【问题描述】:
在 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 @ _]
但是用summon[Mirror.Of[A]] 替换implicitly[Mirror.Of[A]] 编译正常。
在这种情况下和一般情况下,summon 与 implicitly 的微妙之处是什么?
【问题讨论】:
-
This answer 可能是相关的。虽然我对 Scala 3 的
Mirror类型了解不多,无法将其与您的代码 sn-p 连贯地联系起来,所以我会让其他人来做这个荣誉。