Gre*_*idt 6 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库的交互.使用a PartialFunction
会在提供可能以其他方式获得回报的集合API的某些方法方面具有显着优势吗?这样的代码通常会更简洁吗?
相关但不同的问题:
感觉Option
可能更适合您的用例。
我的解释是,偏函数可以很好地在输入范围内进行组合。因此,如果f
是 和(SanDiego,Irvine)
是g
定义的,那么您可以通过执行 来获得在组合输入和(Paris,London)
上定义的函数。(SanDiego,Irvine)
(Paris,London)
f orElse g
但在你的情况下,似乎给定(l1,l2)
位置元组发生了一些事情,然后你做了一些工作......
如果您发现自己写了很多代码{case (L,M) => ... case (P,Q) => ...}
,那么这可能表明部分函数更适合。
否则,选项可以很好地与其余集合一起使用,并且可以像这样使用而不是您的(a)提案:
val processedPaths = for {
f <- finders
p <- f(l1, l2)
} yield process(p)
Run Code Online (Sandbox Code Playgroud)
在 for 理解中,p
被提升为 an Traversable
,因此您甚至不必调用filter
,isDefined
或get
跳过没有结果的查找器。
归档时间: |
|
查看次数: |
466 次 |
最近记录: |