Dadas três maneiras de expressar a mesma função f(a) := a + 1:
val f1 = (a:Int) => a + 1
def f2 = (a:Int) => a + 1
def f3:(Int => Int) = a => a + 1
Como essas definições diferem? O REPL não indica quaisquer diferenças óbvias:
scala> f1
res38: (Int) => Int = <function1>
scala> f2
res39: (Int) => Int = <function1>
scala> f3
res40: (Int) => Int = <function1>
f1no REPL mostra o valor vinculado estaticamentef1ao avaliarf2ef3mostra o resultado da chamada desses métodos. Em particular, uma novaFunction1[Int, Int]instância é produzida toda vez quef2ouf3é invocada, enquantof1é a mesmaFunction1[Int, Int]para sempre.