在在线会话中,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
?