除了orElse之外,为什么没有部分函数链接方法

时间:2017-09-29 18:07:28

标签: scala

我问这个问题,因为我发现自己需要类似于普通函数andThen的功能(但仍然符合部分函数的语义)。我的意思应该解释如下:

函数

andThen

val x: Int => Int = ???
val y: Int => Double = ???
val z: Int => Double = x andThen y
部分函数的

andThen(由于andThen已经存在且具有不同的语义,因此命名不同):

val x: PartialFunction[A, B] = ???
val y: PartialFunction[B, C] = ???
val z: PartialFunction[A, C] = x andThenExtact y

在参数z上定义了a: A,其中包含以下属性:

  1. x在

  2. 中定义
  3. y在x(a)

  4. 中定义

    我提出了以下扩展,原则上应该提供所需的功能:

    type =>?[-A, +B] = PartialFunction[A, B]
    
    class RichPartialFunction[A, B](private val lhs: A =>? B) extends AnyVal {
    
      def andThenWiden[BB >: B, R](widening: BB =>? R): A =>? R = {
        val InnerMatcher = matchArgument(lhs)
        val pf: A =>? R = {
          case InnerMatcher(res) if widening.isDefinedAt(res) =>
            widening(res)
        }
        pf
      }
    
      def andThenExact[R](pipeTo: B =>? R): A =>? R = {
        val InnerMatcher = matchArgument(lhs)
        val pf: A =>? R = {
          case InnerMatcher(res) if pipeTo.isDefinedAt(res) =>
            pipeTo(res)
        }
        pf
      }
    
    }
    private def matchArgument[A, B](fun: A =>? B): PartiallyUnapply[A, B] = new PartiallyUnapply(fun)
    
    private class PartiallyUnapply[A, B](private val fun: A =>? B) extends AnyVal {
      def unapply(arg: A): Option[B] = {
        fun.andThen(Some(_)).applyOrElse(arg, (_: A) => None)
      }
    }
    

    我的问题是这个问题有更好的解决方案,如果我的方法不好,那我怎么能在我的代码中替换x andThenExtact y

0 个答案:

没有答案