Funções de ordem superior

Scala permite definir funções de ordem superior. Tais funções recebem outras funções como parâmetros, ou resultam em uma função. Por exemplo, a função apply recebe outra função f e um valor v então aplica a função f emv:

def apply(f: Int => String, v: Int) = f(v)

Nota: métodos são automaticamente convertidos em funções se o contexto demandar.**

Outro exemplo:

class Decorator(left: String, right: String) {
  def layout[A](x: A) = left + x.toString() + right
}

object FunTest extends App {
  def apply(f: Int => String, v: Int) = f(v)
  val decorator = new Decorator("[", "]")
  println(apply(decorator.layout, 7))
}

A execução produz a saída:

[7]

Nesse exemplo, o método decorator.layout é automaticamente convertido em um valor do tipo Int => String conforme o método apply demanda. Note que o método decorator.layout é um método polimórfico (por exemplo: ele abstrai alguns tipos de sua assinatura) e o compilador Scala precisa primeiro instanciar corretamento o tipo do método.