【发布时间】:2019-12-09 12:09:17
【问题描述】:
猫是否提供类似于
的扁平化implicit class FlattenListOfEither[L, R](l: List[Either[L, R]]) {
def flattenM: List[R] = l collect { case Right(v) => v }
}
这样
val l1: List[Either[String, Int]] = List(Right(1), Right(2), Left("error"), Right(4))
l1.flattenM
输出
List(1, 2, 4)
类似于 vanilla Scala 扁平化选项列表的方式
val l2: List[Option[Int]] = List(Some(1), Some(2), None, Some(4))
l2.flatten
哪个输出
List(1, 2, 4)
separate 给出以下语法
import cats.implicits._
val (_, rights) = l1.separate
rights
哪个输出
List(1, 2, 4)
但是是否存在开箱即用的 flatten 类扩展方法,它只返回权限而不是元组?
【问题讨论】:
-
我怀疑这种方法是否存在。对于像 Monads 这样的一般抽象来说,它没有任何意义,因为您需要一种方法来将任何嵌套元素视为与外部相同类型的元素。使用选项的情况有效,因为在 stdlib 上,Option 可以隐式 转换为 IterabeOnce (只有一个元素) - 老实说我不喜欢这样,但那是另一个讨论。现在,如果它是一种仅适用于内部 Eithers 的特殊方法,那么
separate是更有意义的方法 - 恕我直言,最好是使用collect
标签: scala flatten scala-cats either