मैंक्या मैं इस रचना को सरल बनाने के लिए मोनाड ट्रांसफार्मर का उपयोग कर सकता हूं?
type VS[A] = Validation[String, A]
val v: VS[Option[A]]
val f: A => VS[B]
है लगता है मुझे प्रकार VS[Option[B]]
का एक परिणाम प्राप्त करना चाहते हैं, लेकिन अगर v
एक Success(None)
है, परिणाम भी एक Success(None)
होना चाहिए।
scala> val v: VS[Option[String]] = some("4.5").success
v: VS[Option[String]] = Success(Some(4.5))
scala> val f = (s : String) => (try { s.toInt.success } catch { case x => x.getMessage.fail }): VS[Int]
f: String => VS[Int] = <function1>
तब:
scala> import Validation.Monad._
import Validation.Monad._
scala> (v map2 f map (_.sequence)).join
res4: scalaz.Validation[String,Option[Int]] = Failure(For input string: "4.5")
सफलता मामला है:
scala> val v: VS[Option[String]]= some("5").success
v: VS[Option[String]] = Success(Some(5))
scala> (v map2 f map (_.sequence)).join //UGLY composition
res7: scalaz.Validation[String,Option[Int]] = Success(Some(5))
और खाली मामला है:
scala> val v: VS[Option[String]]= none[String].success
v: VS[Option[String]] = Success(None)
scala> (v map2 f map (_.sequence)).join
res6: scalaz.Validation[String,Option[Int]] = Success(None)
एक "अच्छे है यहाँ एक उदाहरण है "ऐसा करने का तरीका (संभवतः क्लेस्ली संरचना या एम शामिल है ओनड ट्रांसफार्मर)?