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

scala – 在两者中都存在昂贵的计算是定义和应用PartialFunction

发布时间:2020-12-16 09:28:03 所属栏目:安全 来源:网络整理
导读:很有可能要知道函数是否在某个时刻定义,计算其价值的重要部分必须完成.在PartialFunction中,当实现isDefined和apply时,两种方法都必须这样做.怎么办这个常见的工作成本很高? 有可能缓存其结果,希望在isDefined之后调用apply.绝对丑陋. 我经常希望PartialFun
很有可能要知道函数是否在某个时刻定义,计算其价值的重要部分必须完成.在PartialFunction中,当实现isDefined和apply时,两种方法都必须这样做.怎么办这个常见的工作成本很高?

有可能缓存其结果,希望在isDefined之后调用apply.绝对丑陋.

我经常希望PartialFunction [A,B]是函数[A,选项[B]],这显然是同构的.或者,PartialFunction中可能有另一种方法,例如applyOption(a:A):Option [B].对于一些mixins,实现者可以选择实现isDefined和apply或applyOption.或者所有这些都是安全的,性能明智.在调用apply之前测试isDefined的客户端将被鼓励使用applyOption.

但事实并非如此.库中的一些主要方法,其中收集集合需要PartialFunction.是否有一种干净(或不那么干净)的方式来避免支付isDefined和apply之间重复的计算?

另外,applyOption(a:A):Option [B]方法合理吗?在未来版本中添加它听起来可行吗?它值得吗?

解决方法

为什么要缓存这样的问题?在大多数情况下,您有本地计算,因此只要您为缓存编写包装器,就不必担心它.我的实用程序库中有以下代码:

class DroppedFunction[-A,+B](f: A => Option[B]) extends PartialFunction[A,B] {
    private[this] var tested = false
    private[this] var arg: A = _
    private[this] var ans: Option[B] = None
    private[this] def cache(a: A) {
      if (!tested || a != arg) {
        tested = true
        arg = a
        ans = f(a)
      }
    }        
    def isDefinedAt(a: A) = {
      cache(a)
      ans.isDefined
    }
    def apply(a: A) = {
      cache(a)
      ans.get
    }
  }
  class DroppableFunction[A,B](f: A => Option[B]) {
    def drop = new DroppedFunction(f)
  }
  implicit def function_is_droppable[A,B](f: A => Option[B]) = new DroppableFunction(f)

如果我有一个昂贵的计算,我写一个函数方法A =>选项[B]并执行类似(f _).drop以在collect或whatnot中使用它. (如果你想内联,你可以创建一个方法,采用A => Option [B]并返回一个部分函数.)

(相反的转换 – 从PartialFunction到A => Option [B] – 被称为提升,因此“drop”;“unlift”是一个更广泛使用的术语,用于相反的操作.)

(编辑:李大同)

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

    推荐文章
      热点阅读