Scala:选择函数返回选项与部分函数

Scala:选择函数返回选项与部分函数,scala,option,partialfunction,Scala,Option,Partialfunction,我是一个相对Scala的初学者,我想了解一些关于如何继续实现的建议,这些实现似乎可以通过函数返回选项或PartialFunction来完成。我已经阅读了所有我能找到的相关文章(见问题的底部),但这些似乎涉及使用PartialFunction或将一个转换为另一个的技术细节;我正在寻找一种类型的答案:“如果情况是x,y,z,那么使用另一个B,但也要考虑C”。< /P> 我的示例用例是使用路径查找器库在位置之间进行路径搜索。假设位置类型为L,路径类型为P,所需路径搜索结果将为Iterable[P]。补

我是一个相对Scala的初学者,我想了解一些关于如何继续实现的建议,这些实现似乎可以通过函数返回选项或PartialFunction来完成。我已经阅读了所有我能找到的相关文章(见问题的底部),但这些似乎涉及使用PartialFunction或将一个转换为另一个的技术细节;我正在寻找一种类型的答案:“如果情况是x,y,z,那么使用另一个B,但也要考虑C”。< /P> 我的示例用例是使用路径查找器库在位置之间进行路径搜索。假设位置类型为
L
,路径类型为
P
,所需路径搜索结果将为
Iterable[P]
。补丁搜索结果应该通过询问所有路径查找者(在谷歌地图中,这些人可能是自行车、汽车、步行、地铁等)的路径建议来组合,这些建议可能是或可能不是为特定的开始/结束位置对定义的

这似乎有两种方法:

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

(b) 将路径查找器定义为
f:PartialFunction[(L,L),p],然后通过类似于
finders.filter(u.isDefined((l1,l2))).map(u.apply((l1,l2))的方式获得结果

似乎使用返回
选项[p]
的函数可以避免对结果进行双重计算,因此对于昂贵的计算,这可能更可取,除非缓存结果。似乎使用
选项
可以拥有任意输入签名,而
PartialFunction
需要一个参数。但我特别感兴趣的是,从有实际经验的人那里听到一些不那么直接、更“宏观”的考虑,比如与Scala库的交互。使用
PartialFunction
在提供某些可能以其他方式获得回报的集合API方法方面会有显著的好处吗?这样的代码一般会更简洁吗

相关但不同的问题:


感觉
选项
可能更适合您的用例

我的解释是,部分函数在输入范围内很好地组合。因此,如果
f
是在
(桑迪戈,欧文)
上定义的,而
g
是在
(巴黎,伦敦)
上定义的,那么通过执行
f orElse g
,可以得到在组合输入
(桑迪戈,欧文)
(巴黎,伦敦)
上定义的函数

但在您的例子中,似乎对于给定的
(l1,l2)
位置元组发生了一些事情,然后您做了一些工作

如果您发现自己编写了大量的
{case(L,M)=>…case(p,Q)=>…}
,那么这可能是部分函数更适合的迹象

否则,选项与其他系列配合良好,可以像这样使用,而不是您的(a)建议:

val processedPaths = for {
  f <- finders
  p <- f(l1, l2)
} yield process(p)
val processedpath=for{

f这并不尽人皆知,但因为2.8 Scala在其集合上定义了一个
collect
方法。
collect
类似于
filter
,但采用了一个局部函数,并具有您描述的语义