相关疑难解决方法(0)

如何将X => Option [R]转换为PartialFunction [X,R]

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

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

但是,如果任务相反,那该怎么办:假设我有一个函数作为参数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 }
}
Run Code Online (Sandbox Code Playgroud)

我错过了一些更好的方法吗?

scala partialfunction scala-option

22
推荐指数
3
解决办法
2588
查看次数

Scala:选择返回Option与PartialFunction的函数

我是一个相对Scala初学者,并希望得到一些关于如何继续实现的建议,看起来可以通过返回Option或PartialFunction的函数来完成.我已经阅读了我能找到的所有相关帖子(参见问题的底部),但这些似乎涉及使用PartialFunction或将其中一个转换为另一个的技术细节; 我正在寻找类型的答案"如果情况是X,Y,Z,那么使用A其他B,但也考虑C".

我的示例用例是使用路径查找器库在位置之间进行路径搜索.假设位置是类型L,路径是类型P,所需的路径搜索结果是Iterable[P].补丁搜索结果应该通过询问所有路径查找器(像Google地图这些可能是自行车,汽车,步行,地铁等等)的路径建议来组装,这些建议可能会或可能不会针对特定的开始/定义结束位置对.

似乎有两种方法可以解决这个问题:

(a)将路径查找器定义为f: (L,L) => Option[P],然后通过类似的方式获得结果finders.map( _.apply(l1,l2) ).filter( _.isDefined ).map( _.get )

(b)将路径查找器定义为f: PartialFunction[(L,L),P] and then get the result via something likefinders.filter(_.isDefined((l1,l2))).map(_.apply((l1,l2)))`

似乎使用函数返回Option[P]将避免对结果进行双重评估,因此对于昂贵的计算,除非有人缓存结果,否则这可能是优选的.似乎使用Option一个可以有一个任意输入签名,而PartialFunction期望一个参数.但是我特别感兴趣的是听到有实际经验的人关于不那么直接,更大的"更大图片"考虑因素,例如与Scala库的交互.使用a PartialFunction会在提供可能以其他方式获得回报的集合API的某些方法方面具有显着优势吗?这样的代码通常会更简洁吗?

相关但不同的问题:

scala option partialfunction

6
推荐指数
1
解决办法
466
查看次数

标签 统计

partialfunction ×2

scala ×2

option ×1

scala-option ×1