我对Shape还很陌生,所以这个问题可能很简单。
以下是ADT:
sealed trait Test
final case class A() extends Test
final case class B() extends Test
final case class C() extends Test
...
final case class Z() extends Test
有没有可能在没有极其繁琐模式匹配的情况下编写函数?
def split(lst: List[Test]): List[A] :: List[B] :: ... :: HNil = //
1条答案
按热度按时间rmbxnbpk1#
在编译时,
List
的所有元素都具有相同的静态类型Test
,因此无法区分元素A
、B
、C
...仅使用编译时技术(无形状、类型类、隐式、宏、编译时反射)。这些元素仅在运行时可区分,因此您必须使用一些运行时技术(模式匹配、强制转换、运行时反射)。Why Does This Type Constraint Fail for List[Seq[AnyVal or String]]
Scala: verify class parameter is not instanceOf a trait at compile time
flatMap with Shapeless yield FlatMapper not found
尝试使用运行时反射将
split
添加到Map中或使用非成形+运行时反射将
split
转换为HList
测试:
Scala 3 collection partitioning with subtypes(Scala 2/3)