検証オブジェクトがあります
val v = Validation[String, Option[Int]]
たとえば、実際の整数値が 100 に等しいかどうかを確認するために、2 番目の検証を行う必要があります。私が行った場合
val vv = v.map(_.map(intValue => if (intValue == 100)
intValue.success[String]
else
"Bad value found".fail[Integer]))
私は得る:
Validation[String, Option[Validation[String, Int]]]
vv を Validation[String, Option[Int]] としても最も簡潔な方法で取得するにはどうすればよいですか
=========
私自身から可能な解決策を見つけました:
val validation: Validation[String, Option[Int]] = Some(100).success[String]
val validatedTwice: Validation[String, Option[Int]] = validation.fold(
_ => validation, // if Failure then return it
_.map(validateValue _) getOrElse validation // validate Successful result
)
def validateValue(value: Int): Validation[String, Option[Int]] = {
if (value == 100)
Some(value).success[String]
else
"Bad value".fail[Option[Int]]
}
機能しますが、簡潔でエレガントに見えません
==============
私自身の2番目の解決策ですが、複雑すぎるようにも見えます:
val validatedTwice2: Validation[String, Option[Int]] = validation.flatMap(
_.map(validateValue _).map(_.map(Some(_))) getOrElse validation)
def validateValue(value: Int): Validation[String, Int] = {
if (value == 100)
value.success[String]
else
"Bad value".fail[Int]
}