2014-12-16 3 views
2

Option 대신 Scalaz 'traversetraverseUEither으로 사용할 수 있습니까? 다음 코드를Scalaz의 트래버스 및 트래버스 U를 사용하는 방법

는 : 모든 것이 잘 갔다 경우 하나 개 이상의 장애 또는 Left(list)가있는 경우

val list = List(1, 2, 3) 

def f(i: Int): Either[Int, String] = 
    if (i > 2) Left(i) 
    else Right("must be lower than 3") 

나는 flist을 통과하고 중 첫 번째 Right(msg)을 반환합니다.

+0

의도적으로 왼쪽과 오른쪽으로 전환 했습니까? 일반적으로 Left는 처리 실패를 의미합니다. – Dimitri

+0

@Dimitri 아니, 전혀 목적에 없었어! 나는 OCaml에서 왔고 아직 스칼라의 관례에 익숙하지 않다. 명확하게 해 주셔서 감사합니다. – Antoine

+0

스칼라가 오른쪽 대칭 인 * 오른쪽 * 하나는 꽤 대칭입니다. (실제로는 조금 너무 많아서 종종 불편합니다.) –

답변

4

scalaz에서 ValidationNonEmptyList을 사용하지 않는 이유가 있습니까? 대신 첫 번째 오류에 실패 할 경우

당신은 쉽게 당신이 scala.Either하지만 오른쪽 바이어스

에 동형 Either의 scalaz 버전 일명 \/를 사용할 수

def f(i: Int) = 
    if (i > 2) i.successNel 
    else "something wrong".failureNel 

List(1, 2, 3).traverseU(f) // Failure(NonEmptyList(something wrong, something wrong)) 
List(3, 4, 5).traverseU(f) // Success(List(3, 4, 5)) 

과 같은 작업을 수행 할 수 있습니다

def f(i: Int) = 
    if (i > 2) \/-(i) 
    else -\/("something wrong") 

List(1, 2, 3).traverseU(f) // Failure(something wrong) 
List(3, 4, 5).traverseU(f) // Success(List(3, 4, 5)) 
+0

해답을 주셔서 감사합니다. 최대한 빨리 해보겠습니다. – Antoine