Thursday, November 5, 2009

Function._

If you have not looked at the Function object I would recommend you do. It contains several useful methods for combining and converting functions.

Examples:
  1. cala> def twoParamFunc( i:Int, j:String) = println(i,j)
  2. twoParamFunc: (i: Int,j: String)Unit
  3. // the tupled method converts the function with n parameters into
  4. // a function that takes one tupleN
  5. scala> val tupled = Function tupled twoParamFunc _
  6. tupled: ((IntString)) => Unit = < function1>
  7. scala> tupled (1 -> "one"
  8. (1,one)
  9. // A practical use-case is to convert an existing method
  10. // for use with a Map
  11. // Example with out using the tupled method
  12. scala> Map( 1 -> "one", 2 -> "two") map (entry => twoParamFunc(entry._1, entry._2)) 
  13. (1,one)
  14. (2,two)
  15. res5: scala.collection.immutable.Iterable[Unit] = List((), ())
  16. // example using tupled
  17. scala> Map( 1 -> "one", 2 -> "two") map (tupled)  
  18. (1,one)
  19. (2,two)
  20. res7: scala.collection.immutable.Iterable[Unit] = List((), ())
  21. // and for balance the opposite
  22. scala> val untupled = Function untupled tupleParamFunc _
  23. untupled: (IntString) => Unit = < function2>
  24. scala> untupled(1, "one"
  25. tuple = (1,one)
  26. // Chain is for chaining together an arbitrary number of functions
  27. scala> def inc(i:Int) = i + 1 
  28. inc: (i: Int)Int
  29. scala> def double(i:Int) = i*i
  30. double: (i: Int)Int
  31. scala> def decr(i:Int) = i - 1
  32. decr: (i: Int)Int
  33. scala> (Function chain List(inc _, double _, decr _, double _, inc _, inc _))(3)
  34. res10: Int = 227
  35. // Now examples curries two methods then chains them together
  36. // define basic methods
  37. scala> def inc(step:Int,i:Int) = i + step 
  38. inc: (step: Int,i: Int)Int
  39. scala> def multiply(i:Int, j:Int) = i * j
  40. multiply: (i: Int,j: Int)Int
  41. // Convert them to methods where the first argument is 3
  42. scala> val inc3 = (Function curried inc _)(3)
  43. inc3: (Int) => Int = < function1>
  44. scala> val multiplyBy3 = (Function curried multiply _)(3)
  45. multiplyBy3: (Int) => Int = < function1>
  46. // chain the resulting Function1 objects together and execute chain with parameter 3
  47. // (3 + 3)*3 = 18
  48. scala> chain(List(inc3, multiplyBy3))(3)
  49. res12: Int = 18

1 comment:

  1. Jesse, just wanted to stop by to say your blog must be one of the best around. By now I stopped counting how many times I was searching for an answer on a Scala topic and found it right here on your blog. Thanks!

    ReplyDelete