我正在尝试使用Scalaz(scala 2.10,ScalaZ 7.1版)进行验证。我有一个包含13个字段的案例类,所以我最终得到了13个验证。我正在使用组合器来组合所有验证并构建类,如果一切都成功的话。如果只有12个组合器,一切都很好。当我添加第13个时,我收到一条消息,说“value | @ |不是scalaz.syntax.ApplicativeBuilder的成员”。
为了重现,我启动了REPL并试图合并12个项目:
scala> (1.some |@| 2.some |@| 3.some |@| 4.some |@| 5.some |@| 6.some |@| 7.some |@|
8.some |@| 9.some |@| 10.some |@| 11.some |@| 12.some )
{_ + _ + _ + _ + _ + _ + _ + _ + _ +_ +_ +_ }
res11: Option[Int] = Some(78)
工作得很好。然后我试图合并13个项目:
scala> (1.some |@| 2.some |@| 3.some |@| 4.some |@| 5.some |@| 6.some |@| 7.some |@|
8.some |@| 9.some |@| 10.some |@| 11.some |@| 12.some |@| 13.some)
{_ + _ + _ + _ + _ + _ + _ + _ + _ +_ +_ +_ + _}
<console>:14: error: value |@| is not a member of
scalaz.syntax.ApplicativeBuilder[Option,Int,Int]#ApplicativeBuilder3[Int]#
ApplicativeBuilder4[Int]#ApplicativeBuilder5[Int]#ApplicativeBuilder6[Int]#
ApplicativeBuilder7[Int]#ApplicativeBuilder8[Int]#ApplicativeBuilder9[Int]#
ApplicativeBuilder10[Int]#ApplicativeBuilder11[Int]#ApplicativeBuilder12[Int]
(1.some |@| 2.some |@| 3.some |@| 4.some |@| 5.some |@| 6.some |@| 7.some |@| 8.some |@| 9.some |@| 10.some |@| 11.some |@| 12.some |@| 13.some) {_ + _ + _ + _ + _ + _ + _ + _ + _ +_ +_ +_ + _}
是否有其他方法可以合并所有验证?
答案 0 :(得分:4)
为了完整起见:是的,可以应用应用程序构建器语法的项目数量有限制,是的,它是12。但是,一般情况下,您可以重写以下内容:
(a |@| b |@| c)(Function.uncurried(foo))
如:
c <*> (b <*> a.map(foo))
此语法适用于超过12个元素。有关详细信息,请参阅my answer here。