2

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

这是我当前的代码:

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)) 
}

有没有更好的办法 ?有更好的命名吗?

4

1 回答 1

0

如果你liftthen match,你只需要评估pf一次(不像你的解决方案,它评估两次):

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

或者您可以使用unliftwhich 接受一个函数Option并返回等效项PartialFunction

def zip[A,B](pf: PartialFunction[A,B]) = Function.unlift((x:A) => pf.lift(x).map(x -> _))
于 2015-03-11T22:01:38.570 回答