#scala #tuples #inline #scala-3
#scala #Кортежи #встроенный #scala-3
Вопрос:
Предполагается, что прозрачная строка возвращает верхнюю границу, но в случае кортежей это не так.
object TupleTest {
inline def toList[T <: Tuple](x: T): List[String] =
inline erasedValue[T] match
case _: EmptyTuple => Nil
case _: (t *: ts) =>
val arg = x.asInstanceOf[t *: ts]
arg.head.toString :: toList[ts](arg.tail)
transparent inline def tupleize[T](x: T): NonEmptyTuple =
inline erasedValue[T] match
case _: (h *: t) => x.asInstanceOf[h *: t]
case _: T => x *: EmptyTuple
inline def toListAny[T](x: T): List[String] =
val arg = tupleize(x)
toList(arg)
}
TupleTest.toList(1, 2)
TupleTest.toListAny(5, 6) // Does not compile
Ссылка на Scastie: https://scastie.scala-lang.org/xQPP2xNdQwS2vG2dGirlVA
Комментарии:
1.
tupleize
предполагается, что возвращает aNonEmptyTuple
, но вторая ваша ветвьinline match
возвращает anEmptyTuple
, которая явно не является непустой.