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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读