根据验证是成功还是失败,执行不同副作用的最佳方式

时间:2012-09-14 13:57:11

标签: scala scalaz

我希望解决方案不是基于if-else的明显模式匹配。我确信应该有更自然的方式来做,例如在选项上组合mapgetOrElse

3 个答案:

答案 0 :(得分:6)

Validation有一种fold方法,可以选择产生副作用:

v.fold(e => println("Ouch, we got "+e), a => println("Yay!!  We got "+a))

答案 1 :(得分:1)

Validation.fold

用字符填写答案......

答案 2 :(得分:1)

为了完整起见,您可能希望在使用副作用后进行验证:

object Test {
  import scalaz._
  import syntax.bifunctor._
  import syntax.validation._
  def f(s: String) = { println(s"Err ${s}"); s }
  def g(i: Int) = { println(s"Int ${i}"); i }
  def m(x: Validation[String, Int]) = x bimap (f, g)
  def n(x: Validation[String, Int]) = f _ <-: x :-> g _
  def main(args: Array[String]) {
    val v = 17.success[String]
    val w = "nope".failure[Int]
    println(m(v) map (i => i + 1))
    println(m(v)); println(m(w))
    println(n(v)); println(n(w))
  }
}

或者,您可能只喜欢有面孔的操作员。 emoticonic运营商在功能社区中有名字吗?鉴于我现在的心情,我会尝试emoperator,就像在mope中一样,但这可能太狭隘了。还是“lolop”?但像x这样的用法: - &gt; f显然是一种“面部表情”。