2017-06-13 4 views
0

I ont deux fonctions partielles f1 et f2 que je veux composer en une nouvelle fonction partielle f de sorte que f.isDefinedAt(x) ssi f1.isDefinedAt(x) || f2.isDefinedAt(x). Je veux direRédaction de fonctions partielles à Scala

 -- 
     | f1(x) iff f1.isDefinedAt(x) 
     | 
f(x) = | 
     | 
     | f2(x) iff !f1.isDefinedAt(x) && f2.isDefinedAt(x) 
     -- 

est-il un moyen de composer f1 et f2 de cette façon?

Répondre

1

PartialFunction Utilisation méthode .orElse sur PartialFunction:

scala> val f1: PartialFunction[Int, Unit] = { case x if x > 0 => println(s"called f1 with $x") } 
f1: PartialFunction[Int,Unit] = <function1> 

scala> val f2: PartialFunction[Int, Unit] = { case x if x < 0 => println(s"called f2 with $x") } 
f2: PartialFunction[Int,Unit] = <function1> 

scala> (f1 orElse f2)(1) 
called f1 with 1 

scala> (f1 orElse f2)(-1) 
called f2 with -1 

scala> (f1 orElse f2)(0) 
scala.MatchError: 0 (of class java.lang.Integer) 
    at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:253) 
    at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:251) 
    at $anonfun$1.applyOrElse(<console>:11) 
    at $anonfun$1.applyOrElse(<console>:11) 
    at scala.runtime.AbstractPartialFunction$mcVI$sp.apply$mcVI$sp(AbstractPartialFunction.scala:36) 
    at scala.runtime.AbstractPartialFunction$mcVI$sp.apply(AbstractPartialFunction.scala:36) 
    at scala.runtime.AbstractPartialFunction$mcVI$sp.apply(AbstractPartialFunction.scala:28) 
    at $anonfun$1.applyOrElse(<console>:11) 
    at $anonfun$1.applyOrElse(<console>:11) 
    at scala.PartialFunction$OrElse.apply(PartialFunction.scala:167) 
    at scala.Function1$class.apply$mcVI$sp(Function1.scala:36) 
    at scala.PartialFunction$OrElse.apply$mcVI$sp(PartialFunction.scala:164) 
    ... 32 elided