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.
0 comments:
Post a Comment