scalapartialfunction

Define an object extending PartialFunction, implement directly with cases


I'm quite new to Scala but I already love it. I have read tutorials and articles on partial functions. What I would like to achieve is to have an object extending PartialFunction[...,...] and have it defined directly with cases, without needing to define isDefinedAt and apply methods.

For example

val partialfuncval : PartialFunction[Int,Boolean] = {
    case 1 => false
}

is a valid definition of a partial function. But why can't I write

object PartialFunctionClass extends PartialFunction[Int,Boolean] {
    case 1 => false
}

? This would cancel the need of defining isDefinedAt and apply and would make writing classes of certain (predefined by a lib I'm using) types easier.


Solution

  • Would one of these options suffice you?

    Option 1

    abstract class DelegatingPartialFunction[-T,+R](underlying: PartialFunction[T,R]) extends PartialFunction[T,R] {
      def apply(t: T) = underlying.apply(t)
      def isDefinedAt(t: T) = underlying.isDefinedAt(t)
    }
    

    Then:

    object PartialFunctionClass extends DelegatingPartialFunction[Int,Boolean]({
      case 1 => false
    })
    

    Option 2

    trait DelegatingPartialFunction[-T,+R] extends PartialFunction[T,R] {
      val underlying: PartialFunction[T,R]
      def apply(t: T) = underlying.apply(t)
      def isDefinedAt(t: T) = underlying.isDefinedAt(t)
    }
    

    Then:

    object PartialFunctionClass extends DelegatingPartialFunction[Int,Boolean] {
      val underlying = {
        case 1 => true
      }
    }