2017-07-19 3 views
1

私はスカラ猫のライブラリを勉強しようとしています。だから、私は全く新しいプログラミングです。猫スケーラのモナドトランス

私は例の機能の下から値を抽出するために助けてください:

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 

答えて

1

私が思うに、下記の最も簡単な方法です:

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

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

ます。また、結果を持ち上げるために、純粋な機能を使用することができます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