加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 可以访问Option容器的选项操作符

发布时间:2020-12-16 09:07:21 所属栏目:安全 来源:网络整理
导读:我有一些函数(f2..fn)取一个A,然后返回选项[A].这非常好地工作(假设f1:X =选项[A])来做例如 f1(x) flatMap f2 flatMap f3 现在我希望能够记录发生的事情,特别是在没有引入的地方.我希望能够插入一个功能,例如: log_none(m:String):Option[A] = Option[A]
我有一些函数(f2..fn)取一个A,然后返回选项[A].这非常好地工作(假设f1:X =>选项[A])来做例如

f1(x) flatMap f2 flatMap f3

现在我希望能够记录发生的事情,特别是在没有引入的地方.我希望能够插入一个功能,例如:

log_none(m:String):Option[A] => Option[A]

如果遇到None,则会产生记录的副作用.

选项功能似乎都不适用于此(阅读后,例如tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/)

理想情况下,它看起来像:

f1(x) <.> log_none("f1 failed") flatMap f2 <.> log_none("f2 failed") ...

我不能立即看到一种优雅,惯用的方式来做到这一点 – 我看不到任何东西要放在<.>位置.

解决方法

对于scalaz的验证,这是一个很好的例子.它类似于Option但不是None,它会给你一个错误值.

之前:

def f1(x: Int): Option[Int]
def f2(x: Int): Option[Int]
def f2(x: Int): Option[Int]

for {
  x1 <- f1(x)
  x2 <- f2(x1)
  x3 <- f3(x2)
} yield x3

您可以使用隐式的toSuccess进行简单转换

import scalaz.{Validation,Success,Failure}
import scalaz.Validation.FlatMap._
import scalaz.syntax.std.option._

def oldf1(x: Int): Option[Int]

def f1(x: Int): Validation[String,Int] = oldf1(x).toSuccess("f1 failed")
def f2(x: Int): Validation[String,Int]
def f2(x: Int): Validation[String,Int]

val validatedX3: Validation[String,Int] = for {
  x1 <- f1(x)
  x2 <- f2(x1)
  x3 <- f3(x2)
} yield x3

validatedX3 match {
  case Success(i) =>
    Some(i)
  case Failure(errStr) => 
    log(errStr)
    None
}

或者交替

validatedX3.leftMap(log).toOption

你可以使用scala进行类似的操作,但是它更加痛苦,因为你需要在整个地方使用.toRightProjection.

我假装验证是Validation.FlatMap导入的monadic,即使它不是,但如果您的f1,2,3不需要排序,您也可以使用应用程序版本来收集多个错误. http://eed3si9n.com/learning-scalaz/Validation.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读