我有一個驗證對象Scalaz驗證,驗證內值
val v = Validation[String, Option[Int]]
我需要進行第二次的驗證,以檢查是否實際整數值是等於100例如。如果我做
val vv = v.map(_.map(intValue => if (intValue == 100)
intValue.success[String]
else
"Bad value found".fail[Integer]))
我得到:
Validation[String, Option[Validation[String, Int]]]
怎麼可能讓維維也爲驗證[字符串,選項[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]]
}
看起來不簡潔大方,雖然它的工作原理
==============
從我自己的解決方案二,但看起來也過compicated:
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]
}
爲什麼'parseInt'? – 2012-02-06 19:52:57