2013-10-07 33 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) 
     } 
     } 

據鏈com.twitter.util.Future操作,每個方法返回一個Future[\/[InvalidResponse, CorrectResponse]]

我現在想mapmatch對結果。

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

什麼是正確的語法matchleftright之間?

回答

3

比賽語法

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

您也可以在EitherT摺疊/ catamorphism:

seq.fold(something, somethingElse) 

其中something取左值的值&返回類型X的值,並且somethingElse取值爲右類型並返回類型X的值。整個表達式的結果爲未來[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

當然,但在你的情況下,你正在使用它作爲驗證,所以你可以轉換和使用成功/失敗 – Alex