假設,你有一個型別為F[Either[T, T]]的東西,你想在你的F下平鋪Either,因為Either的兩個型別都有相同的型別,并且其值對你的程式并不重要。
我發現只需使用Either.fold和使用identity函式兩次,但我認為應該有更好的方法來做到這一點。
import cats.Functor。
import cats.syntax.functor._
import scala.concurrent.Awaiting
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future。
import scala.concurrent.duration.DurationInt
import scala.language.higherKinds
def foo[F[_]: Functor, T](itherF: F[Either[T, T] )。F[T] =
eitherF.map(ither => either.fold(identity, identity))
val flattenProcess = foo[Future, String](Future(Left[String, String]("left"/span>))
.flatMap{
prev =>
println(prev)
foo[Future, String](Future(Right[String, String]("rigth"/span>))
}
println(Await.result(flattenProcess, 10.seconds)
// printts:
//左邊
// rigth
這里我使用Future只是為了舉例說明一些包裝的效果。
scala std lib或者cats庫是否有一些東西可以讓它更優雅?
或者,這只是我使用Either的糟糕設計的一個問題?
uj5u.com熱心網友回復:
EitherF.map(_.merge)
它將Either[T, T]轉換為T。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/326155.html
標籤:
