只要我们有一个PartialFunction[X,R],就很容易将其转换为返回Option[R]的函数,例如

def pfToOptf[X, R](f: PartialFunction[X,R])(x: X) =
    if (f.isDefinedAt(x)) Some(f(x))
    else None

但是,如果任务相反,该怎么办:假设我有一个函数f,将X作为参数,然后返回Option[R]。我想用它制作一个PartialFunction[X,R]。什么是最好的方法?

我的想法看起来很难看:
def optfToPf[X,R](f: X => Option[R]) : PartialFunction[X,R] = {
    object extractor {
        def unapply(x: X): Option[R] = f(x)
    }

    { case extractor(r) => r }
}

我错过了更好的方法吗?

最佳答案

Scala 2.9开始, Function.unlift 正是这样做的:

def unlift[T, R](f: (T) => Option[R]): PartialFunction[T, R]

08-17 11:48