将函数输入参数与输出混合的最佳方法是什么。
这是我当前的代码:
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))
}
有没有更好的办法 ?有更好的命名吗?
将函数输入参数与输出混合的最佳方法是什么。
这是我当前的代码:
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))
}
有没有更好的办法 ?有更好的命名吗?
如果你lift
then 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
which 接受一个函数Option
并返回等效项PartialFunction
:
def zip[A,B](pf: PartialFunction[A,B]) = Function.unlift((x:A) => pf.lift(x).map(x -> _))