在Scala 3中,假设我有一个List[Try[String]]
。我可以将它分为成功和失败,这样每个列表都有合适的子类型吗?
如果我执行以下操作:
import scala.util.{Try, Success, Failure}
val tries = List(Success("1"), Failure(Exception("2")))
val (successes, failures) = tries.partition(_.isSuccess)
那么successes
和failures
仍然是List[Try[String]]
类型。如果我根据类型进行筛选,情况也是如此:
val successes = tries.filter(_.isInstanceOf[Success[String]])
当然,我可以分别转换为Success
和Failure
,但有没有一种类型安全的方法来实现这一点呢?
1条答案
按热度按时间von4xj4u1#
@Luis Miguel Mejía Suárez:
使用
tries.partitionMap(_.toEither)
@mitchus:
@LuisMiguelMejíasuárez ok这里的诀窍是,
Try
有一个toEither
方法,它可以拆分成正确的类型。如果我们有一个正常的密封特征呢?在Scala 2中,我会这样做
https://scastie.scala-lang.org/DmytroMitin/uQp603sXT7WFYmYntDXmIw/1
我设法将这段代码翻译成Scala3,尽管翻译变得冗长(我重新实现了
Generic
和Coproduct
)Scala 3.0.2
在宏(生成模式匹配)中,应该使用
Inferred(typeRepr)
而不是TypeIdent(typeRepr.typeSymbol)
,否则这不适用于参数案例类。实际上,如果我们使用mirror.ordinal
,则可以完全删除宏。简化版本是用编译时/内联方法和匹配类型替换类型类
在3.2.0 https://scastie.scala-lang.org/DmytroMitin/940QaiqDQQ2QegCyxTbEIQ/1中测试
How to access parameter list of case class in a dotty macro
loop
的替代实现Scala 2的另一个实现:Split list of algebraic date type to lists of branches?