Question

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.

Was it helpful?

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
  }
}

OTHER TIPS

Another option that might work depending on the use-case is

type PartialFunctionAlias = PartialFunction[Int,Boolean]

Then:

val partialfuncval: PartialFunctionAlias = {
  case 1 => false
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top