scala – 在两者中都存在昂贵的计算是定义和应用PartialFunction
很有可能要知道函数是否在某个时刻定义,计算其价值的重要部分必须完成.在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”是一个更广泛使用的术语,用于相反的操作.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |