将函数输入参数与输出混合的最佳方法是什么。
这是我目前的代码:
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))
}
有更好的方法吗? 是否有更好的命名?
答案 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 }
或者您可以使用unlift
将Option
函数转换为PartialFunction
并返回<{1}}:
def zip[A,B](pf: PartialFunction[A,B]) = Function.unlift((x:A) => pf.lift(x).map(x -> _))