2

検証に Scalaz (scala 2.10、バージョン 7.1 の ScalaZ) を使用しようとしています。13 個のフィールドを持つケース クラスがあるため、最終的に 13 個の検証が行われます。コンビネータを使用してすべての検証を結合し、すべてが成功した場合にクラスを構築しています。コンビネータが 12 個しかない場合は、すべて問題ありません。13番目を追加すると、「値 |@| は 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) {_ + _ + _ + _ + _ + _ + _ + _ + _ +_ +_ +_ + _}

すべての検証を組み合わせる別の方法はありますか?

4

1 に答える 1

4

完全を期すために: はい、Applicative Builder 構文を適用できる項目の数には制限があり、はい、12 です。ただし、一般的には、次のように書き換えることができます。

(a |@| b |@| c)(Function.uncurried(foo))

として:

c <*> (b <*> a.map(foo))

この構文は、12 個を超える要素に対して機能します。詳細については、こちらの回答を参照してください。

于 2014-08-17T18:32:07.227 に答える