【发布时间】:2021-04-18 12:25:18
【问题描述】:
在线会议期间,Adam Warski 展示了一个技巧来证明元组具有一定的结构:
第一个实现是
def sequence[T <: Tuple](t: T): Option[InverseMap[T, Option]] =
val unwrapped = t.productIterator.collect { case Some(v) => v}.toArray[Any]
if unwrapped.length == t.productArity then Some(Tuple.fromArray(unwrapped).asInstanceOf[InverseMap[T, Option]])
else None
允许(但不应该)
sequence(("x", true)) // compiles
还有一个技巧来实现
def betterSequence[T <: Tuple](t: T)(using T <:< Map[InverseMap[T, Option], Option]): Option[InverseMap[T, Option]] =
val unwrapped = t.productIterator.collect { case Some(v) => v}.toArray[Any]
if unwrapped.length == t.productArity then Some(Tuple.fromArray(unwrapped).asInstanceOf[InverseMap[T, Option]])
else None
betterSequence(("x", true)) // compile error
能不能解释一下
(using T <:< Map[InverseMap[T, Option], Option])
有效,为什么T 是Map 的子类型?
【问题讨论】:
标签: scala types scala-macros scala-3