如何将PartialFunction输入参数与输出混合

时间:2015-03-11 14:27:13

标签: function scala partialfunction

将函数输入参数与输出混合的最佳方法是什么。

这是我目前的代码:

def zip[A,B](f: A => B) : A => (A, B) = (a: A) => (a, f(a))
def zip[A,B](pf: PartialFunction[A,B]) : PartialFunction[A, (A, B)] = { 
  case a if pf.isDefinedAt(a) => (a, pf(a)) 
}

有更好的方法吗? 是否有更好的命名?

1 个答案:

答案 0 :(得分:0)

如果您lift然后match,则只需评估pf一次(与您的解决方案不同,评估两次):

def zip[A,B](pf: PartialFunction[A,B]): PartialFunction[A, (A, B)] = 
    x => pf.lift(x) match { case Some(res) => x -> res }

或者您可以使用unliftOption函数转换为PartialFunction并返回<{1}}:

def zip[A,B](pf: PartialFunction[A,B]) = Function.unlift((x:A) => pf.lift(x).map(x -> _))