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

在Scala中链接和部分功能

发布时间:2020-12-16 21:34:21 所属栏目:安全 来源:网络整理
导读:让我们重复从每日 scala的例子: type PF = PartialFunction[Int,Int]val pf1 : PF = {case 1 = 2} val pf2 : PF = {case 2 = 3} 让我们补充一点: val pf3 : PF = {case 3 = 4} 然后在这里工作: pf1 andThen pf2 isDefinedAt(x) 返回true iff x == 1(实际
让我们重复从每日 scala的例子:

type PF = PartialFunction[Int,Int]

val pf1 : PF = {case 1 => 2}                      

val pf2 : PF = {case 2 => 3}

让我们补充一点:

val pf3 : PF = {case 3 => 4}

然后在这里工作:

pf1 andThen pf2 isDefinedAt(x)

返回true iff x == 1(实际上,pf2根本不需要是PartialFunction)

但是,我预计:

pf1 andThen pf3 isDefinedAt(x)

将为所有x返回false(即,iff pf1被定义,检查pf3),但它不仅仅验证pf1.

最后,pf1和tf pf3 lift(x)总是导致MatchError.我希望得到无…我可以通过解除pf1.lift(x).flatMap(pf3.lift)中的每个函数来获取这个行为,但是有没有更简单的方法使用纯PartialFunction API? (并且不分别提升每个部分功能)

解决方法

如果你看看,然后:

def andThen[C](k: (B) => C): PartialFunction[A,C]

这组成了具有功能而不是部分功能的接收机.也就是说,k预计将被完全定义,它没有isDefinedAt.因此,所得到的部分函数不需要改变isDefinedAt的行为,它仍然只需要参考第一个部分函数.

您可以编写自己的扩展名,其中包含两个部分功能:

implicit class ComposePartial[A,B](pf: PartialFunction[A,B]) {
  def collect[C](that: PartialFunction[B,C]): PartialFunction[A,C] =
    new PartialFunction[A,C] {
      def apply(a: A): C = that(pf(a))
      def isDefinedAt(a: A) = pf.isDefinedAt(a) && {
        val b = pf(a)
        that.isDefinedAt(b)
      }
    }
}

pf1 collect pf2 isDefinedAt(1)  // true
pf1 collect pf3 isDefinedAt(1)  // false

问题是您必须调用pf(a),所以考虑到Scala不执行纯度,您可能会不必要地执行副作用.

(编辑:李大同)

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

    推荐文章
      热点阅读