2014-06-23 2 views
4

웹 응용 프로그램에서 여러 가지 방법으로 실패하거나 결국 성공할 수있는 작업이 있습니다./[A, A]에서 A로

val result = for { 
    user <- fetchUser \/> Forbidden("you must be connected to perform this action") 
    basket <- user.basket \/> NotFound("no basket !") 
    ... 
} yield Ok(someBasketView(user, basket)) 

:이 컨텍스트의 성공과 실패에서

은/같은 뭔가, 내 알고리즘을 인코딩하는

내가 scalaz에 모나드 연산을 사용 (HTTP 응답을 나타내는) SimpleResult의 서브 클래스에 의해 표현된다 ,

result fold (identity, identity) 

가 분리에서 결과를 추출 : 그래서 이것은 SimpleResult \/ SimpleResult로 끝 나는이를 작성해야 나는 오히려 못 생겼다.

"분명히 단순한 구조"를 캡처하는 추상화가 있습니까? 또는 아마도 분리는 그 문제에 대한 올바른 추상화가 아니겠습니까?

scala> val e: Either[String, String] = Right("a") 
e: Either[String,String] = Right(a) 

scala> e.merge 
res0: String = a 

을 그리고 :

답변

7

표준 라이브러리 및 Scalaz 모두 merge으로이 작업을 제공

scala> import scalaz._, Scalaz._ 
import scalaz._ 
import Scalaz._ 

scala> val ez: String \/ String = "a".right 
ez: scalaz.\/[String,String] = \/-(a) 

scala> ez.merge 
res1: String = a 

을에 대한 자세한 내용을 모른 채 당신의 SimpleResult 이것이 분리의 합법적 인 사용 여부를 말하기 어렵다 일반적으로 생성자에서 결과가 실패인지 여부에 대한 정보를 캡처합니다.

+0

감사합니다. 그것은 그 문서를 열심히 검색하지 않은 것처럼 보입니다 ... –

+0

이제는 둘 중 하나에 병합 메서드가 표시되지만 scalaz 7.0.4에서 해당 메서드를 찾을 수 없습니다. –

+0

[Here] (https : // github .com/scalaz/scalaz/blob/scalaz-seven/core/src/main/scala/scalaz/Either.scala # L305)? –