这看起来像是类型类的工作!(请注意,唯一需要的 Scala 3 特定功能是*:
)
def subset[T1 <: Tuple, T2 <: Tuple](t: T1)(using s: Subset[T1, T2]): T2 = s(t)
opaque type Subset[T1 <: Tuple, T2 <: Tuple] = T1 => T2
object Subset:
given [T1 <: Tuple]: Subset[T1, EmptyTuple] = _ => EmptyTuple
given [A, T1 <: Tuple, T2 <: Tuple](using s: Subset[T1, T2]): Subset[A *: T1, A *: T2] =
case a *: t => a *: s(t)
given [A, T1 <: Tuple, T2 <: Tuple](using s: Subset[T1, T2]): Subset[A *: T1, T2] =
case _ *: t => s(t)
在 Scastie 中看到它
如果您希望它不管顺序如何都可以工作,它会稍微复杂一些但仍然易于管理:
opaque type Find[T <: Tuple, E] = T => E
object Find:
given [T <: Tuple]: Find[T, EmptyTuple] = _ => EmptyTuple
given [A, T <: Tuple]: Find[A *: T, A] =
case a *: _ => a
given [A, H, T <: Tuple](using f: Find[T, A]): Find[H *: T, A] =
case _ *: t => f(t)
opaque type Subset[T1 <: Tuple, T2 <: Tuple] = T1 => T2
object Subset:
given [T1 <: Tuple]: Subset[T1, EmptyTuple] = _ => EmptyTuple
given [A, T1 <: Tuple, T2 <: Tuple](using
s: Subset[T1, T2],
f: Find[T1, A]
): Subset[T1, A *: T2] =
t => f(t) *: s(t)
def subset[T1 <: Tuple, T2 <: Tuple](t: T1)(using s: Subset[T1, T2]): T2 = s(t)
在 Scastie 中看到它