30 kwietnia 2012

Wywołanie funkcji w Scali inaczej

Podczas lektury Different ways of calling functions w artykule Use functional programming techniques to write elegant JavaScript z 13 czerwca 2006 trafiłem na dosyć ciekawe wywołanie funkcji, którego wcześniej nie miałem przyjemności poznać.


$ scala
Welcome to Scala version 2.10.0-M2 (OpenJDK 64-Bit Server VM, Java 1.8.0-jdk8-b35).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val f = (x:Int, s:String) => s*x
f: (Int, String) => String = <function2>

scala> f(2, "a")
res0: String = aa

scala> (f) (2, "a")
res1: String = aa

scala> ((x:Int, s:String) => s*x) (2, "a")
res2: String = aa
Jeszcze nie wiem, gdzie i dlaczego chciałbym z tego skorzystać, ale moja głowa prawie eksplodowała z wrażenia! Czy to, aby nie ma związku z częściowym wywołaniem funkcji (ang. currying)?!

Po kwadransie, w którym główkowałem wciąż nad tematem...

Już wiem! Nie ma znaczenia, czy korzystam z symbolu funkcyjnego czy definicji funkcji anonimowej, która przez przypisanie do symbolu staje się nieanonimowa, owe wykonanie powyżej, w każdym przypadku po prostu wywoła funkcję. Ostatni przykład to właśnie prezentuje. Takie zagadki językowe lubię.