1

I have this for-comprehension:

 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 chains com.twitter.util.Future operations, each of the methods returning a Future[\/[InvalidResponse, CorrectResponse]]

I now want to map or match over the result.

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

What is the correct syntax to match between left and right?

4

2 回答 2

4

匹配语法是

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

您还可以在 EitherT 上进行折叠/变形:

seq.fold(something, somethingElse)

wheresomething取一个左类型的值 & 返回一个 X 类型的值,并somethingElse取一个右类型的值并返回一个 X 类型的值。整个表达式的结果是 Future[X]

于 2013-10-07T22:39:56.373 回答
-3

使用验证怎么样?那么它将是

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

我想在你的情况下,它会是

{
  case Right(r) => do r
  case Left(l) => do l
}
于 2013-10-07T21:14:12.900 回答