gpt4 book ai didi

scala - 将 HList 中的验证应用于案例类

转载 作者:行者123 更新时间:2023-12-04 23:54:42 26 4
gpt4 key购买 nike

在尝试使用应用仿函数 ( Monad to catch multiple exceptions (not just fail on single) ) 进行验证时,我在 scalaz 中遇到了一个硬性限制,该限制不允许超过 14 个仿函数,因此这里的有用评论 ( https://github.com/scalaz/scalaz/issues/504#issuecomment-23626237 ) 引导我使用 HLists 而不是应用仿函数

现在它工作得很好(在必须从这里手动放入这个序列文件之后,因为它不在 maven https://github.com/typelevel/shapeless-contrib/blob/master/scalaz/main/scala/sequence.scala?source=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手动构造函数。

关于scala - 将 HList 中的验证应用于案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18564570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com