Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 将验证从HList应用到案例类_Scala_Scalaz_Shapeless_Hlist - Fatal编程技术网

Scala 将验证从HList应用到案例类

Scala 将验证从HList应用到案例类,scala,scalaz,shapeless,hlist,Scala,Scalaz,Shapeless,Hlist,在尝试使用application functor()进行验证时,我遇到了scalaz中的一个硬限制,即不允许使用超过14个functor,因此这里()的一条有用的注释引导我使用HLists而不是applicative functor 现在它工作得非常好(因为它不在maven中,所以必须从这里手动放入这个序列文件) 我的问题是,我知道这是可能的,您如何自动实例化案例类Foo(I:Int,s:String),而不必手动将模式与案例匹配,只需重新应用参数 基本上我想做这样的事情 case clas

在尝试使用application functor()进行验证时,我遇到了scalaz中的一个硬限制,即不允许使用超过14个functor,因此这里()的一条有用的注释引导我使用HLists而不是applicative functor

现在它工作得非常好(因为它不在maven中,所以必须从这里手动放入这个序列文件)

我的问题是,我知道这是可能的,您如何自动实例化
案例类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
的所有参数中都相同

因此,我们可以编写以下内容(假设错误是字符串):

这在验证中为我们提供了一个
Int::String::HNil
。现在我们可以使用同构:

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

无需解构列表并手动应用
Foo
构造函数。

您可以添加导入以编译上述内容吗?
scala> valHList.map(fooIso.from)
res0: scalaz.Validation[scalaz.NonEmptyList[String],Foo] = Success(Foo(1,2))