用相同的类型在两侧展平 Either

Flatten Either with the same types on the both sides

让我们假设,你有一些类型为 F[Either[T, T]] 的东西并且你想在你的 F 下展平 Either 因为两个 Either 类型有相同的类型和值对您的程序无关紧要。

我发现只使用 Either.fold 并在两侧使用 identity 函数两次,但我认为应该有更好的方法来做到这一点。

import cats.Functor
import cats.syntax.functor._

import scala.concurrent.Await
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
import scala.concurrent.duration.DurationInt
import scala.language.higherKinds

def foo[F[_]: Functor, T](eitherF: F[Either[T, T]]): F[T] =
  eitherF.map(either => either.fold(identity, identity))

val flattenProcess = foo[Future, String](Future(Left[String, String]("left")))
  .flatMap{
    prev =>
      println(prev)
      foo[Future, String](Future(Right[String, String]("rigth")))
  }
println(Await.result(flattenProcess, 10.seconds))
// prints: 
// left
// rigth

这里我使用Future只是为了一些包裹效果的例子。

scala std lib 或 cats 库是否有使它更优雅的东西? 或者这可能只是我使用 Either?

的糟糕设计的问题

尝试Either#merge

eitherF.map(_.merge)

Either[T, T] 转换为 T