2014-04-25 4 views
0

나는 거의 혼란 스럽다. scalaz의 마술.신청 건축업자를 위해 reduceLeft를 사용하는 스카치

def isThree(x: Int): Validation[NonEmptyList[String], Int] = if (x!= 3){("failed: %d" format x).wrapNel.failure} else {x.success} 

println((isThree(6) |@| isThree(7) |@| isThree(13)) {_ + _ + _}) 

출력 : 실패 여기 내 코드입니다 (실패 NonEmptyList (: 7 실패 : 6, 실패 13)) 이 출력은 내가 원하는입니다. 내가 함께 체인 그들에게 실용적 빌더를 사용하려면,

  1. 내가 확인의 순서를 가정

    여기 내 질문입니다.

    seq (isThree (13), isThree (15)) reduceLeft (_ | @ | _) 형식이 일치하지 않아 컴파일이 실패한 이유는 무엇입니까?

    println((isThree(6) |@| (sThree(7) |@| isThree(13))) {_ + _ + _}) 여전히 컴파일 오류를 가지고 : 나는 브라켓를 사용하는 경우

  2. 그것은 첫 번째 질문과 유사하다. @ | |

또한, 나는 < * 대신를 사용하여 첫 번째 문제를 해결할 수 있습니다 알고 있지만, 그것은 사용하기 편리하지 보이는 것을 왜 난 아직도 혼란 스러워요.

미리 감사드립니다.

+0

정확한 오류 메시지를 확인하는 것이 좋습니다. 2. 당신은 오타가 있습니다. 'sThree (7)' – Kigyo

+0

'vals.sequenceU.map (_. sum)'또는'vals.suml' 대신 응용 프로그램 빌더 구문을 사용하려는 이유가 있습니까? –

+0

또는 List (6, 7, 13) .traverseU (isThree) .map (_. sum)'도 있습니다. 처음에는 유효성 검사 목록을 작성하는 것보다 낫습니다. –

답변

2

작동 방식 : | @ | 결과 유형이 ValidationNel (Applicative)이 아니지만 ApplicativeBuilder입니다. 먼저 일부 기능에 적용해야합니다.

import scalaz._, Scalaz._ 

    val x1: ValidationNel[String, Int] = 1.successNel 
    val x2: ValidationNel[String, Int] = 2.successNel 
    val x3: ValidationNel[String, Int] = 3.successNel 

    println((x1 |@| x2 |@| x3)(_ + _ + _)) 

    println((x1 :: x2 :: x3 :: Nil).reduceLeft((l, r) => (l |@| r)(_ + _))) 
+0

고마워. –