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