Wednesday, March 3, 2010

Functions using case statements

A further tip regarding using case statements to construct functions. If a case statement is assigned to a Function it will construct a Function object not a PartialFunction.

I suppose the question is why do you care about this since PartialFunction is a Function. The fact is that a PartialFunction is a Function1. But using a case statement you can construct a Function4 very easily.
1. scala> def run(f : Function1[Any,Unit]) = println(f.isInstanceOf[PartialFunction[_,_]])
2. run: (f: (Any) => Unit)Unit
3. /*
4. since run expects a Function calling run as shown here will make a
5. Function object not a PartialFunction Object
6. */
7. scala> run({case f => ()})
8. false
9. scala> def pf(f : PartialFunction[Any,Unit]) = println(f.isInstanceOf[PartialFunction[_,_]])
10. pf: (f: PartialFunction[Any,Unit])Unit
11. // Now a PartialFunction will be created
12. scala> pf({case f => ()})
13. true
14. scala> def run(f : Function2[Int,String,Unit]) = f(1,"2")
15. run: (f: (IntString) => Unit)Unit
16. /*
17. This demonstrates why it is important that a case creates a Function
18. when assigned to a Function. PartialFunctions are Function1 objects
19. but the following statement is creating a Function2 object.
20. */
21. scala> run({
22.      | case (1,b) => println(b)
23.      | case (a,b) => println(a,b)
24.      | })
25. 2