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

scala – 如何使用orElse组合返回Option的函数?

发布时间:2020-12-16 10:05:32 所属栏目:安全 来源:网络整理
导读:假设我有两个函数foo:Int =选项[Int]和bar:Int =选项[Int]并使用它们处理列表: val xs: List[Int] = ...xs flatMap {x = foo(x) orElse bar(x)} 我可以写xs flatMap(foo或Else bar)而不是{x = foo(x)orElse bar(x)}? 我可以使用3d派对库. 解决方法 您可
假设我有两个函数foo:Int =>选项[Int]和bar:Int =>选项[Int]并使用它们处理列表:

val xs: List[Int] = ...
xs flatMap {x => foo(x) orElse bar(x)}

我可以写xs flatMap(foo或Else bar)而不是{x => foo(x)orElse bar(x)}?
我可以使用3d派对库.

解决方法

您可以使用scalaz中Semigroup类型类的组合操作(| |).

Option的默认半群使用内容的半群,如果两个值都存在,则组合值.
因此,要模仿orElse行为,您需要将Options包装在Tags.FirstVal标记中.

Tags.FirstVal的文档指出:

Type tag to choose a scalaz.Semigroup instance that selects the first operand to append.

你可以使用Tag的.subst和.unsubst方法,从一些F [T]中包装和解包一个类型T.在我看来,你必须通过类型推断来帮助Scala.

总而言之,组合功能看起来像这样:

type F[T] = Int => Option[T]
val f = Tags.FirstVal.unsubst(
  Tags.FirstVal.subst[F,Int](foo) |+| 
  Tags.FirstVal.subst[F,Int](bar))

要将它与flatMap一起使用,您必须以某种方式使用隐式转换为Option to List.所以flatMap调用可能如下所示:

xs flatMap (f(_))

你也可以制作| |如果您覆盖Option的隐式Monoid实例,则以orElse身份工作:

import scalaz._,Scalaz._
implicit val inst: Monoid[Option[Int]] = 
  Tags.First.unsubst(scalaz.std.option.optionFirst[Int])

val foo: Int => Option[Int] = x => if (x % 2 == 0) Some(x) else None
val bar: Int => Option[Int] = x => if (x % 3 == 0) Some(x) else None
val xs = List(1,2,3,4,5,6,7,8)

xs.flatMap((foo |+| bar)(_))

(编辑:李大同)

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

    推荐文章
      热点阅读