mde*_*ich 4 scala scalaz hlist shapeless
在尝试使用应用程序仿函数进行验证时(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)
}
}
Run Code Online (Sandbox Code Playgroud)
首先是小点:类型参数for 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)
Run Code Online (Sandbox Code Playgroud)
这为我们提供了Int :: String :: HNil内部验证.现在我们可以使用我们的同构:
scala> valHList.map(fooIso.from)
res0: scalaz.Validation[scalaz.NonEmptyList[String],Foo] = Success(Foo(1,2))
Run Code Online (Sandbox Code Playgroud)
无需解构列表并Foo手动应用构造函数.
| 归档时间: |
|
| 查看次数: |
434 次 |
| 最近记录: |