PartialFunctions 与 orElse 组合的 MatchError
MatchError for PartialFunctions composition with orElse
在为 Actor 编写 Specs2 规范时,我对几个部分函数的组合感到有些困惑MatchError
。
一个最小的例子:
val testPf1 = PartialFunction[Any, Boolean]{ case 2 ⇒ true }
val testPf2 = PartialFunction[Any, Boolean]{ case 1 ⇒ true }
val testPf = testPf1 orElse testPf2
testPf.isDefinedAt(1)
testPf.isDefinedAt(2)
testPf(1)
testPf(2)
导致输出:
testPf1: PartialFunction[Any,Boolean] = <function1>
testPf2: PartialFunction[Any,Boolean] = <function1>
testPf: PartialFunction[Any,Boolean] = <function1>
res0: Boolean = true
res1: Boolean = true
scala.MatchError: 1 (of class java.lang.Integer)
at com.dasgip.controller.common.informationmodel.programming.parametersequence.A$A161$A$A161$$anonfun$testPf1.apply(PFTest.sc0.tmp:33)
at com.dasgip.controller.common.informationmodel.programming.parametersequence.A$A161$A$A161$$anonfun$testPf1.apply(PFTest.sc0.tmp:33)
at scala.PartialFunction$$anonfun$apply.applyOrElse(PFTest.sc0.tmp:243)
at scala.PartialFunction$OrElse.apply(PFTest.sc0.tmp:163)
at #worksheet#.#worksheet#(PFTest.sc0.tmp:36)
这让我很困惑。如果对于给定的输入 isDefinedAt
关于两个部分函数的组合 returns true
,我希望我也可以 apply
它到相同的输入。
因此,我了解到将前两行更改为:
val testPf1: PartialFunction[Any, Boolean] = { case 2 ⇒ true }
val testPf2: PartialFunction[Any, Boolean] = { case 1 ⇒ true }
使组合按预期工作。
MatchError
的原因是
PartialFunction[Any, Boolean]{ case 2 => true }
我实际上似乎在调用 PartialFunction.apply
,它将 Function1
转换为 PartialFunction
。
以便语句扩展为
PartialFunction.apply[Any, Boolean](_ match { case 2 => true })
然后转换为
{ case x => f(x) }
当然,对于 isDefined
总是 return true
并在 f
.
不匹配的输入上抛出 MatchError
在为 Actor 编写 Specs2 规范时,我对几个部分函数的组合感到有些困惑MatchError
。
一个最小的例子:
val testPf1 = PartialFunction[Any, Boolean]{ case 2 ⇒ true }
val testPf2 = PartialFunction[Any, Boolean]{ case 1 ⇒ true }
val testPf = testPf1 orElse testPf2
testPf.isDefinedAt(1)
testPf.isDefinedAt(2)
testPf(1)
testPf(2)
导致输出:
testPf1: PartialFunction[Any,Boolean] = <function1>
testPf2: PartialFunction[Any,Boolean] = <function1>
testPf: PartialFunction[Any,Boolean] = <function1>
res0: Boolean = true
res1: Boolean = true
scala.MatchError: 1 (of class java.lang.Integer)
at com.dasgip.controller.common.informationmodel.programming.parametersequence.A$A161$A$A161$$anonfun$testPf1.apply(PFTest.sc0.tmp:33)
at com.dasgip.controller.common.informationmodel.programming.parametersequence.A$A161$A$A161$$anonfun$testPf1.apply(PFTest.sc0.tmp:33)
at scala.PartialFunction$$anonfun$apply.applyOrElse(PFTest.sc0.tmp:243)
at scala.PartialFunction$OrElse.apply(PFTest.sc0.tmp:163)
at #worksheet#.#worksheet#(PFTest.sc0.tmp:36)
这让我很困惑。如果对于给定的输入 isDefinedAt
关于两个部分函数的组合 returns true
,我希望我也可以 apply
它到相同的输入。
因此,我了解到将前两行更改为:
val testPf1: PartialFunction[Any, Boolean] = { case 2 ⇒ true }
val testPf2: PartialFunction[Any, Boolean] = { case 1 ⇒ true }
使组合按预期工作。
MatchError
的原因是
PartialFunction[Any, Boolean]{ case 2 => true }
我实际上似乎在调用 PartialFunction.apply
,它将 Function1
转换为 PartialFunction
。
以便语句扩展为
PartialFunction.apply[Any, Boolean](_ match { case 2 => true })
然后转换为
{ case x => f(x) }
当然,对于 isDefined
总是 return true
并在 f
.