簡體   English   中英

將驗證從HList應用於案例類

[英]Applying validation from HList to a case class

在嘗試使用應用程序仿函數進行驗證時( Monad捕獲多個異常(不僅僅是單個失敗) ),我在scalaz中遇到了一個禁止超過14個仿函數的硬限制,所以這里有一個有用的注釋( https:// github .com / scalaz / scalaz / issues / 504#issuecomment-23626237 )導航我使用HLists而不是applicative functor

現在它工作得非常好(從此處手動輸入此序列文件,因為它不在maven https://github.com/typelevel/shapeless-contrib/blob/master/scalaz/main/scala/sequence.scala?來源= c

我的問題是,我知道這是可能的,你將如何自動實例化case class Foo(i:Int,s:String)而無需手動將模式與案例匹配,只是再次重新應用參數

基本上我想做這樣的事情

  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)
    }
  }

首先是一個小問題: successNel的類型參數是錯誤類型,而不是成功類型,因此它需要在所有要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構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM