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)}? 解决方法
您可以使用scalaz中Semigroup类型类的组合操作(| |).
Option的默认半群使用内容的半群,如果两个值都存在,则组合值. Tags.FirstVal的文档指出:
你可以使用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)(_)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |