2013-09-02 2 views
4

응용 프로그램 펑크 (Monad to catch multiple exceptions (not just fail on single))를 사용하여 유효성 검사를 시도 할 때 14 명 이상의 펑터를 허용하지 않는 스카 츠에서 하드 한도가 발생 했으므로 여기서 도움이되는 설명 (https://github.com/scalaz/scalaz/issues/504#issuecomment-23626237)으로 이동했습니다. HLists 대신 지금은 완벽하게 잘 작동 실용적 펑HList에서 사례 클래스에 검증 적용

를 사용 (수동 때문에 여기에서이 시퀀스 파일에 넣어 필요 후이 아니 받는다는 https://github.com/typelevel/shapeless-contrib/blob/master/scalaz/main/scala/sequence.scala?source=c에서)

, 어떻게 내 질문은, 나는 이것이 가능 알고 수동으로 패턴을 케이스와 일치시킬 필요없이 case class Foo(i:Int,s:String)을 자동으로 인스턴스화하는 방법에 대해 살펴 보겠다. 가 필요하므로, successNel에 대한 형식 매개 변수는 오류 유형이 아닌 성공 유형 : 그냥 다시

을 매개 변수를 다시 적용 단지에 기본적으로 나는 작은 점에 대해이

case class Foo(i:Int,s:String) 

    implicit def TwoFoo = Iso.hlist(Foo.apply _, Foo.unapply _) 

    val someFoo = sequence(
     1.successNel[Int] :: 
     "2".successNel[String] :: 
     HNil 
).map { Foo.apply _} // Note this doesn't work 

    someFoo match { 
    case Success(a) => println(a) 
    case Failure(a) => { 
     println("failure") 
     println(a) 
    } 
    } 
+0

위 항목을 컴파일하려면 가져 오기를 추가 할 수 있습니까? –

답변

6

먼저 뭔가를하고 싶어 sequence에 대한 모든 논의에서 동일해야합니다.

그래서 우리는 다음과 같은 (우리의 오류 문자열 가정)을 작성할 수 있습니다

import shapeless._, contrib.scalaz._ 
import scalaz._, syntax.validation._ 

case class Foo(i: Int, s: String) 

implicit val fooIso = Iso.hlist(Foo.apply _, Foo.unapply _) 

val valHList = sequence(1.successNel[String] :: "2".successNel[String] :: HNil) 

이 우리에게 검증 내부 Int :: String :: HNil을 제공합니다.

scala> valHList.map(fooIso.from) 
res0: scalaz.Validation[scalaz.NonEmptyList[String],Foo] = Success(Foo(1,2)) 

목록을 해체하고 수동으로 Foo 생성자를 적용 할 필요가 없습니다 : 이제 우리는 우리의 동형를 사용할 수 있습니다.

+0

고마워,이 완벽하게 작동! – mdedetrich