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

scala – 组成部分功能

发布时间:2020-12-16 09:17:49 所属栏目:安全 来源:网络整理
导读:我有两个PartialFunctions f和g. 他们没有副作用,快速执行. 将它们组合成另一个部分功能h的最佳方式是什么? h.isDefinedAt(x)iff f.isDefinedAt(x) g.isDefinedAt(F(X))? 如果h是返回Option而不是部分函数的函数也可以. 我感到失望的是,f和g不做我想做的事
我有两个PartialFunctions f和g.
他们没有副作用,快速执行.
将它们组合成另一个部分功能h的最佳方式是什么?
h.isDefinedAt(x)iff f.isDefinedAt(x)&& g.isDefinedAt(F(X))?

如果h是返回Option而不是部分函数的函数也可以.

我感到失望的是,f和g不做我想做的事情:

scala> val f = Map("a"->1,"b"->2)
f: scala.collection.immutable.Map[String,Int] = Map(a -> 1,b -> 2)

scala> val g = Map(1->'c',3->'d')
g: scala.collection.immutable.Map[Int,Char] = Map(1 -> c,3 -> d)

scala> (f andThen g).isDefinedAt("b")
res3: Boolean = true

scala> (f andThen g).lift("b")
java.util.NoSuchElementException: key not found: 2
    at scala.collection.MapLike$class.default(MapLike.scala:228)

解决方法

这是一个比链接的问题更短的方法,取自 this thread:

val f = Map("a" -> 1,"b" -> 2)                 

  val g = Map(1 -> 'c',3 -> 'd')                 

  def andThenPartial[A,B,C](pf1: PartialFunction[A,B],pf2: PartialFunction[B,C]): PartialFunction[A,C] = {
    Function.unlift(pf1.lift(_) flatMap pf2.lift)
  }                                               

  val h = andThenPartial(f,g)            //> h  : PartialFunction[String,Char]

  h.isDefinedAt("a")                      //> res2: Boolean = true
  h.isDefinedAt("b")                      //> res3: Boolean = false
  h.lift("a")                             //> res4: Option[Char] = Some(c)
  h.lift("b")                             //> res5: Option[Char] = None

当然,这也可以被包装成一个隐式类:

implicit class ComposePartial[A,B](pf: PartialFunction[A,B]) {
    def andThenPartial[C](that: PartialFunction[B,C] =
      Function.unlift(pf.lift(_) flatMap that.lift)
  }

  val h2 = f andThenPartial g         //> h2  : PartialFunction[String,Char]

  h2.isDefinedAt("a")                 //> res6: Boolean = true
  h2.isDefinedAt("b")                 //> res7: Boolean = false
  h2.lift("a")                        //> res8: Option[Char] = Some(c)
  h2.lift("b")                        //> res9: Option[Char] = None

(编辑:李大同)

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

    推荐文章
      热点阅读