我一直在成功使用cats.data.Validated
来解决以下问题,但是使用我现有的解决方案来解决成员超过22个的案例类时遇到了问题(因为无法将构造函数设为{{ 1}})。
这是我的目标:生成一堆Function
,将它们排序为ValidatedNel[E, T]
,然后依次为ValidatedNel[E, (T1, T2, ...)]
(其中mapN(DAOClass)
是DAOClass
,指定的参数)。此方法适用于少于22个参数,但由于两个问题而失败了,而失败了:
case class
不能包含超过22个组件(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
我想念什么?我是否需要在某个地方导入更多隐式内容?有更好的方法吗?
答案 0 :(得分:2)
您忘记添加
scalacOptions += "-Ypartial-unification"
到build.sbt
。对于cats
的正常工作,通常是强制性的。
现在
hlistSequence.map(Generic[DAOClass].from)
产生一个ValidatedNel[String, DAOClass]
:
println(DAOClass.generate) // Valid(DAOClass(1,2))