In Scala, we can partially apply arguments to return new functions.
scala> def add(x: Int)(y: Int) = x + y add: (Int)(Int)Int scala> def foo = add(7) _ foo: (Int) => Int scala> val h = foo(8) h: Int = 15
We can get very funky indeed.
scala> val i = List(1, 2, 3) map foo i: List[Int] = List(8, 9, 10)
Our encoder.
scala> def encoder: String => String => Array[Byte] = null // todo encoder: (String) => (String) => Array[Byte] scala> def utf8 = encoder("UTF-8") utf8: (String) => Array[Byte] scala> def encoded = utf8("contents") encoded: Array[Byte]