}}ここで出てきたIndefiniteですが、これは値の状態を表しています。ComplexValidatorNにおいて値は必ず以下の4種類の状態を取る必要があります。ComplexValidatorNによってバリデーションが実行されたが、バリデーションの結果が不明な状態なぜComplexValidatorNにおいて値を直接与えず、状態を持たせる必要があるか。それはバリデーションを強制するためにあります。さきほどのComplexValidatorNによるバリデーション例を、Personのコンパニオンオブジェクトにて行うよう書き換えてみます。objectのapplyメソッドにおいてIndefiniteを指定している点です。Personとすることが出来ません。Indefinite[String]とStringは当然異なる型ですからね。Indefinite[String]からStringを抜き出すにはComplexValidatorNによるバリデーションを通過させる必要があります。こんな感じでバリデーションを強制しています*2。Invalidの3つは想像が付きやすいと思うのですが、Unknownはなんでしょうか。値の集合をバリデーションするときにどうしても発生し得るのが、「値Bは値A以上であること」などのような、他の値に依存するケースです。普通にValidatorで値Aを参照してあげれば良いのですが、バリデーション前の値はIndefiniteで包まれている以上、直接参照できません。