用相同的类型在两侧展平 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
?
的糟糕设计的问题
eitherF.map(_.merge)
将 Either[T, T]
转换为 T
。
让我们假设,你有一些类型为 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
?
eitherF.map(_.merge)
将 Either[T, T]
转换为 T
。