2013-01-09 3 views
8

Scalaz6에서 유효성 검사 컬렉션을 처리하는 관용적 인 방법이 있습니까?Scalaz6 유효성 검사 목록 처리

val results:Seq[Validation[A,B]] 
val exceptions = results.collect{case Failure(exception)=>exception} 
exceptions.foreach{logger.error("Error when starting up ccxy gottware",_)} 
val success = results.collect{case Success(data)=>data} 
success.foreach {data => data.push} 
if (exceptions.isEmpty) 
    containers.foreach(_.start()) 

결과를 반복 할 때 폴드를 사용한다고 생각할 수 있지만 최종 테스트는 어떻게됩니까?

답변

9

유효성 검사 목록을 사용하는 일반적인 방법은 sequence을 사용하여 목록을 Validation[A, List[B]]으로 바꾸는 것입니다.이 과정에서 오류가있는 경우 비어 있습니다 (즉, Failure).

Validation을 시퀀싱하면 왼쪽 유형의 세미 그룹에서 오류가 즉시 누적됩니다 (Either과 반대로). 따라서 ValidationNEL (NELNonEmptyList을 나타냄)은 단순히 Validation 대신 사용됩니다. ,

scala> results.sequence 
res0: ExceptionsOr[Seq[Int]] = Success(List(13, 42)) 

우리는 다음과 같은 몇 가지 오류가 있다면 :

import scalaz._, Scalaz._ 

type ExceptionsOr[A] = ValidationNEL[Exception, A] 

그리고 어떤 결과 :

val results: Seq[ExceptionsOr[Int]] = Seq(
    "13".parseInt.liftFailNel, "42".parseInt.liftFailNel 
) 

시퀀싱은 다음 당신에게 줄 것이다 그래서 예를 들어, 당신은이 결과 유형이있는 경우 반면에 :

val results: Seq[ExceptionsOr[Int]] = Seq(
    "13".parseInt.liftFailNel, "a".parseInt.liftFailNel, "b".parseInt.liftFailNel 
) 
val results: Seq[ValidationNEL[A, B]] 

results.sequence match { 
    case Success(xs) => xs.foreach(_.push); containers.foreach(_.start()) 
    case Failure(exceptions) => exceptions.foreach(
    logger.error("Error when starting up ccxy gottware", _) 
) 
} 
:

scala> results.sequence 
res1: ExceptionsOr[Seq[Int]] = Failure(
    NonEmptyList(
    java.lang.NumberFormatException: For input string: "a", 
    java.lang.NumberFormatException: For input string: "b" 
) 
) 

따라서 귀하의 경우에는이 같은 것을 써서 :우리는 Failure (내가 여기 그것을 읽을 수 있도록 출력을 포맷 한 주)로 끝날 것

sequence 및 약 Validation에 대한 자세한 내용은 herehere을 참조하십시오.

+0

무료 사례는 어떻게됩니까? 최소한 유효성 검사가 성공하면 성공하고 싶습니다. – Edmondo1984

+0

당신은'Validation'의 곡식에 맞설 것 같습니다. 7에서는'|||'로 목록을 줄일 수 있지만, 6에서는'Either '의 올바른 투영을 위해 세미 그룹을 사용하는 합계와 같은 것이 필요합니다 (아니면 자신 만의'|||'를 쓸 수 있습니다). –

+0

세미 그룹이 무엇인지 설명하는 자료를 가르쳐 주시겠습니까? – Edmondo1984

관련 문제