scala eta-expansion

¿Cuál es la expansión eta en Scala?



eta-expansion (1)

Soy nuevo en Scala. Acabo de escuchar el término "expansión eta" y aproximadamente sé que significa expandir un método a un objeto de función. Pero encuentro pocos recursos en SO que lo introducen sistemáticamente.

Tengo curiosidad acerca de cómo funciona la expansión eta en Scala. ¿Cuáles son los escenarios en que se necesita la expansión eta? ¿Y cómo se implementa la expansión eta en Scala?

Más o menos sé que en casos como este:

def someMethod(x: Int): Int = x * x

someMethod _ se traducirá aproximadamente a un nuevo objeto de función como este:

new Function1[Int, Int] { def apply(x: Int): Int = x * x }

¿Es todo lo que hace Scala?


La definición y algunos ejemplos se dan en http://scala-lang.org/files/archive/spec/2.11/06-expressions.html#method-values .

someMethod _ se traducirá aproximadamente a un nuevo objeto de función como este:

No del todo: en realidad

new Function1[Int, Int] { def apply(x: Int): Int = someMethod(x) }

La diferencia importa, por ejemplo, si algún someMethod se someMethod alguna parte.

¿Es todo lo que hace Scala?

También debe tener en cuenta lo que sucede si el método toma varias listas de parámetros (obtiene una función que devuelve una función) o parámetros por nombre.

¿Cuáles son los escenarios en que se necesita la expansión eta?

  1. Cuando lo solicite específicamente (por ejemplo, someMethod _ ).

  2. Cuando utiliza un método (con parámetros) donde se espera un valor de un tipo de función (o un tipo de SAM en Scala 2.12). P.ej

    def foo(f: Int => Int) = ??? foo(someMethod)

  3. Eso es.

Tenga en cuenta que el uso de eta-expansion y una función anónima con marcadores de posición ( someMethod(_) ) puede comportarse de manera diferente debido a la inferencia de tipos, implicidades, etc.