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

时间:2011-12-01 05:13:07

标签: 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 like finders.filter(_.isDefined((l1,l2)))。map(_.apply((l1,l2)))`

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

相关但不同的问题:

2 个答案:

答案 0 :(得分:3)

感觉Option可能更适合您的用例。

我的解释是,部分函数可以很好地组合在输入范围上。因此,如果在f上定义了(SanDiego,Irvine)并且在g上定义了(Paris,London),那么您可以获得在组合输入(SanDiego,Irvine)和{{上定义的函数1}}通过(Paris,London)

但是在你的情况下看来,对于给定的f orElse g位置元组会发生一些事情然后你做了一些工作......

如果您发现自己写了很多(l1,l2),那么可能表明部分功能更适合。

否则选项适用于其他集合,可以像这样使用,而不是(a)提案:

{case (L,M) => ... case (P,Q) => ...}

在理解中,val processedPaths = for { f <- finders p <- f(l1, l2) } yield process(p) 被提升为p,因此您甚至无需致电TraversablefilterisDefined跳过没有结果的发现者。

答案 1 :(得分:3)

这并不是众所周知的,但是因为2.8 Scala在其集合上定义了collect方法。 collect类似于filter,但它采用部分函数并具有您描述的语义。