【发布时间】:2015-08-23 09:34:30
【问题描述】:
假设我有一些可能具有重叠域的部分函数:
val funcs: Seq[PartialFunction[Any, Int]] = Vector(
{ case i: Int if i % 2 == 0 => i*2 }
,
{ case i: Int if i % 2 == 1 => i*3 }
,
{ case i: Int if i % 6 == 0 => i*5 }
)
我想将它们应用于一个值并收集在该 val 处定义的任何结果。我认为会有一种优雅的方式来使用collect,但我能做的最好的是
val num = 66
funcs.collect { case func if func.isDefinedAt(num) => func(num) }
// or
funcs.filter(_.isDefinedAt(num)).map(_(num))
这看起来不太干净。有没有办法使用内置的案例机制来测试定义性并同时进行评估,也许是通过将它们与测试值或类似的东西相结合?
【问题讨论】:
-
两个 PF 重叠时应该是什么行为?例如。您对
f(8)有何期待? -
@maasg 我认为没有必要合并 PF。这些只是单独的 PF,当它们被定义为特定值时应该调用它们,并且单独的结果应该聚合在一个列表中。 (另外附注
8不是重叠的值,但66是,结果将是:132, 130) -
我想要两个值——这就是为什么我将它定义为一个部分函数列表,而不是一个具有多个
cases 的单个函数(据我所知,这是不可能的从第一个以外的任何匹配案例中获取结果)
标签: scala pattern-matching partialfunction