Thursday, January 05, 2012

PartialFunction in Scala

From: Weblogs Forum - Scala, Patterns and The Perl Effect

I came across this comment thread on Bruce Eckel's blog. Trond Olsen's comments provided an 'aha' moment that helped me understand PartialFunctions:

Partial functions are defined for specific value ranges. The example just showed how you can compose two partial functions, one on {"1","2","3"} and another on {1,2,3}, into one of the union of those. Partial functions gives a runtime error when you hit outside their defined value ranges.

And here's the code:

val f1: PartialFunction[Any,String] = {
  case "1" => "One"
  case "2" => "Two"
  case "3" => "Three"
}

val f2: PartialFunction[Any,String] = {
  case 1 => "One"
  case 2 => "Two"
  case 3 => "Three"
}

val f3 = f1 orElse f2

f3("1")
// res0: String = One

f3(1)
// res1: String = One

f3("3")
// res2: String = Three

f3("a")
// scala.MatchError: a (of class java.lang.String)

And here's further extension of the example:

val f4: PartialFunction[Any,String] = {
  case _ => "undefined"
}

val f5 = f3 orElse f4

f5("a")
// res3: String = undefined




Update July 2013:

And here's a great answer on Stackoverflow that describes "lifting". Lifting is a way to convert a partial function to a function that returns an Option. For values in the range that a PartialFunction accepts a lifted function will return Some; for values outside it's range a lifted PartialFunction will return None.

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.