【问题标题】:Composing partial functions in Scala在 Scala 中编写部分函数
【发布时间】:2017-06-13 17:43:33
【问题描述】:

我有两个偏函数f1f2,我想将它们组合成一个新的偏函数f,这样f.isDefinedAt(x) iff f1.isDefinedAt(x) || f2.isDefinedAt(x)。我是说

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

有没有办法以这种方式编写f1f2

【问题讨论】:

    标签: scala function partialfunction


    【解决方案1】:

    PartialFunction上使用方法.orElse

    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
    

    【讨论】:

      【解决方案2】:

      使用PartialFunctionorElse

      f1 orElse f2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 2020-12-31
        相关资源
        最近更新 更多