Scala 执行不同副作用的最佳方式取决于验证是成功还是失败

Scala 执行不同副作用的最佳方式取决于验证是成功还是失败,scala,scalaz,Scala,Scalaz,我希望解决方案不会基于if-else的明显模式匹配。我相信应该有更自然的方法来实现这一点,比如将map和getOrElse组合在选项上 Validation.fold 用字符填充答案…验证有一种折叠方法,可以选择该方法产生副作用: v.fold(e => println("Ouch, we got "+e), a => println("Yay!! We got "+a)) 为确保完整性,您可能希望在验证产生副作用后对其进行操作: object Test { import

我希望解决方案不会基于if-else的明显模式匹配。我相信应该有更自然的方法来实现这一点,比如将
map
getOrElse
组合在选项上

Validation.fold

用字符填充答案…

验证
有一种
折叠
方法,可以选择该方法产生副作用:

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

为确保完整性,您可能希望在验证产生副作用后对其进行操作:

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))
  }
}
对象测试{
进口scalaz_
导入syntax.bifunctor_
导入语法。验证_
def(s:String)={println(s“Err${s}”);s}
def g(i:Int)={println(s“Int${i}”);i}
defm(x:Validation[String,Int])=x bimap(f,g)
defn(x:Validation[String,Int])=f_g_
def main(参数:数组[字符串]){
val v=17.成功[字符串]
val w=“nope”。失败[Int]
println(m(v)图(i=>i+1))
println(m(v));println(m(w))
println(n(v));println(n(w))
}
}

或者,你可能喜欢有脸的操作符。表情操作符在函数社区中有名字吗?考虑到我现在的心情,我想试试emoperator,就像在《忧郁》中一样,但那个可能太狭隘了。还是“lolop”?但是像x:->f这样的用法显然是一种“面部表情”。

不要用无意义的字符填充答案,而是举例说明如何使用您建议的代码。问题创建者没有要求提供示例。这无关紧要。搜索一个最佳答案也是如此,它不仅回答问题,而且给出解释、示例等。在最佳情况下,应该可以将答案作为博客文章、文章或书籍阅读。@user1296806我认为在这种情况下,你应该提供自己的答案和论点。