Scala:如何将ValidatedNel的HList转换为HList的ValidatedNel

时间:2018-07-12 20:25:14

标签: scala shapeless scala-cats

我一直在成功使用cats.data.Validated来解决以下问题,但是使用我现有的解决方案来解决成员超过22个的案例类时遇到了问题(因为无法将构造函数设为{{ 1}})。

这是我的目标:生成一堆Function,将它们排序为ValidatedNel[E, T],然后依次为ValidatedNel[E, (T1, T2, ...)](其中mapN(DAOClass)DAOClass,指定的参数)。此方法适用于少于22个参数,但由于两个问题而失败了,而失败了:

  1. case class不能包含超过22个组件
  2. (T1, T2, ...)无法转换为DAOClass.apply

因此,我正在考虑使用Function处理第1部分并遇到问题。我应该可以使用Generic[DAOClass]来满意地处理第2部分,或者如果它不起作用,请使用extensible records并增加一些样板。

这是一些小的示例代码(不包含22个组件):

shapeless.HList

这使用package example import cats.syntax.validated._ import cats.data.ValidatedNel import cats.sequence._ import shapeless._ case class DAOClass(a: Int, b: Int) object DAOClass { def generate: ValidatedNel[String, DAOClass] = { val hlist: ValidatedNel[String, Int] :: ValidatedNel[String, Int] :: HNil = 1.validNel :: 2.validNel :: HNil val hlistSequence: ValidatedNel[String, Int :: Int :: HNil] = hlist.sequence hlistSequence.map(Generic[DAOClass].from) } } 库对kittens进行排序。

不幸的是,这给了我一个编译错误:

HList

我已经将其提取到一个测试项目中;这是我的[error] ...src/main/scala/example/DAOClass.scala:17:73: cannot construct sequencer, make sure that every item of your hlist shapeless.:: [cats.data.ValidatedNel[String,Int],shapeless.::[cats.data.ValidatedNel[String,Int],shapeless.HNil]] is an Apply [error] val hlistSequence: ValidatedNel[String, ::[Int, ::[Int, HNil]]] = hlist.sequence [error] ^

build.sbt

我想念什么?我是否需要在某个地方导入更多隐式内容?有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

您忘记添加

scalacOptions += "-Ypartial-unification"

build.sbt。对于cats的正常工作,通常是强制性的。

现在

hlistSequence.map(Generic[DAOClass].from)

产生一个ValidatedNel[String, DAOClass]

println(DAOClass.generate) // Valid(DAOClass(1,2))