猫scala中的monad变形金刚

猫scala中的monad变形金刚,scala,scala-cats,Scala,Scala Cats,我正在努力学习scala猫图书馆。所以我对函数式编程是完全陌生的 请帮助我从以下示例函数中提取值: import cats._ import cats.data._ import cats.syntax._ import cats.implicits._ import cats.functor._ import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future //import c

我正在努力学习scala猫图书馆。所以我对函数式编程是完全陌生的

请帮助我从以下示例函数中提取值:

import cats._
import cats.data._
import cats.syntax._
import cats.implicits._
import cats.functor._

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
//import cats.syntax.applicative._


//Here i added test functions to return Either[List[String], A] where left is collecting error list.

case class User(name:String)
case class Users(ppl:List[User])

val testUsers = List(User("test1"), User("test2"))

val func0:Future[Either[List[String], Users]] = () => Future.successful(testUsers.asRight[List[String]])
val func1:(Users => Either[List[String], User]) = (users:Users) => users.ppl(0).asRight[List[String]]

//How to make this function to return Future[Either[List[String], User]] = ???
val res:Future[Either[List[String], Either[List[String], User]]] = EitherT(func0).map(func1).value

我认为,下面是一个最简单的方法:

val testUser: Future[Either[List[String], Either[List[String], User]]] = ???

val testUser1: Future[Either[List[String], User]] = testUser.map(_.flatMap(identity))

您还可以使用pure函数将func0的结果提升到EitherT中,然后将其组合在一起以便于理解

import cats.data._
import cats.implicits._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
import cats.instances.future._

case class User(name: String)

case class Users(ppl: List[User])

val testUsers = List(User("test1"), User("test2"))

val func0: Future[Either[List[String], Users]] = () => Future.successful(testUsers.asRight[List[String]])
val func1: (Users => Either[List[String], User]) = (users: Users) => users.ppl.head.asRight[List[String]]

type ListEither[A] = EitherT[Future, List[String], A]

val res: Future[Either[List[String], User]] = for {
  f0 <- func0.pure[ListEither]
  f1 <- EitherT(f0).map(func1).value
} yield f1
导入cats.data_
进口猫_
导入scala.concurrent.ExecutionContext.Implicits.global
导入scala.concurrent.Future
导入cats.instances.future_
案例类用户(名称:字符串)
案例类用户(ppl:列表[用户])
val testUsers=List(用户(“test1”)、用户(“test2”))
val func0:Future[List[String],Users]=()=>Future.successful(testUsers.asRight[List[String]])
val func1:(Users=>or[List[String],User])=(Users:Users)=>Users.ppl.head.asRight[List[String]]
键入listether[A]=EitherT[Future,List[String],A]
val res:Future[列表[字符串],用户]]=for{
f0