2013-10-07 3 views
1

У меня есть это для-понимания:карту или соответствовать Scalaz.EitherT

val seq = for { 
     accessToken <- EitherT(getAccessToken(code)) 
     data <- EitherT(getDefaultData(accessToken)) 
     user <- EitherT(mapUser(data.getResponseBody)) 
     } yield { 
     if (Users.getUserByOriginId(user.origin).isEmpty) { 
      Users.register(user) 
      OAuthProvider.redirectToSignUp(user.userId.get) 
     } else { 
      OAuthProvider.redirectToAuthentication(user.userId.get) 
     } 
     } 

It цепочек com.twitter.util.Future операций, каждый из методов возвращая Future[\/[InvalidResponse, CorrectResponse]]

Я теперь хочу map или match над результатом ,

val response = seq.run match { 
    case x.left => "something" 
    case y.right => "something else" 
}// this syntax is invalid 

Что такое правильный синтаксис для match между left и right?

ответ

3

Синтаксис матча

val response = seq.run.map{fut => fut.match { 
     case -\/(left) => "something" 
     case \/-(right) => "something else" 
    } 
} 

Вы также можете сделать фолд/катаморфизм на EitherT:

seq.fold(something, somethingElse) 

, где something принимает значение левого типа & возвращает значение типа X и somethingElse принимает значение правильного типа и возвращает значение типа X. Результат всего выражения Future [X]

+0

Я бы определенно пошел на сгиб! –

-3

Что касается использования валидации? то было бы

{ 
case Success(s) => do s 
case Failure(f) => do f 
} 

я думаю, в вашем случае, это будет

{ 
    case Right(r) => do r 
    case Left(l) => do l 
} 
+0

Я был не первым downvoter, но это просто не ответ. 'Validation' - это другой тип с другой семантикой, а' Right' и 'Left' не являются конструкторами для' \/'. –

+0

уверен, но в вашем случае вы используете его точно как подтверждение, так что вы можете конвертировать и использовать Success/Failure – Alex

Смежные вопросы