Dado algo como:Extracto método de función independiente en Scala
class A {
def f(x: X) = ...
def g(y: Y, z: Z) = ...
...
}
Cómo extraer (automáticamente) la función (s):
object A {
val f' = (a: A, x: X) => a.f(x) // do this automagically for any arbitrary f
val g' = (a: A, y: Y, z: Z) => a.g(y, z) // and deal with arity > 1 too
...
}
Con esta firma tipo exacto (en primer lugar el objeto, luego la lista de parámetros). Permítanme decir el problema con toda claridad:
."Teniendo en cuenta un método
f(x1: X1, ..., xn: Xn)
se define en el contexto de una claseA
, cómo extraer automáticamente una funciónf'
que (i) recibe una instanciaa
de tipoA
y (ii) una lista de parámetros que corresponde 1: 1 a la lista de parámetros def
, vizx1: X, ... xn: Xn
, que la implementación es exactamentea.f(x1: X1, ..., xn: Xn)
"
O incluso:
Capturar el concepto de extensionalidad de cálculo lambda, tales que extraiga automáticamente una
λx.(f x)
def
siemprex
no aparece libre enf
.
Esta primera podría abordarse mediante la búsqueda de un camino de acceso, los identificadores f
g
, ... sin tener una específica a: A
(uno podría tener una específica A
después, por supuesto). Simplemente podríamos escribir f'
o g'
a mano, pero permitamos DRYness.
P.S. Tal vez esto no sea posible sin la reflexión en tiempo de ejecución (aunque puede ser posible con las macros Scala 2.10+), ya que no puedo encontrar una manera de referirme a los identificadores de f
o g
sin una instancia específica (a: A
) de antemano. Pero sería algo como lo siguiente, sin tener que recurrir a strings
:
A.getMethod("f"): Function2[A, X, ...]
También me di cuenta de que los usos prácticos de la pregunta puede ayudar a los participantes a sugerir alternativas, pero estoy discutiendo esto en un sentido abstracto . No estoy tratando de resolver otro problema que he reducido a este. Estoy tratando de saber si es posible :-) Aquí hay un very nice article para entender realmente la motivación detrás de esta pregunta, con comentarios sobre Eta-expansions en Scala.
El uso de la reflexión para tales fines en realidad no es una buena idea. Inevitablemente resultará ser una sobrecomplicación, reducirá el rendimiento y destruirá todo el punto de utilizar un lenguaje estático, ya que todas las resoluciones de métodos e invocaciones se realizarán en tiempo de ejecución. Realmente debería considerar diferentes enfoques para su problema, como, por ejemplo, el uso de implícitos. Probablemente extender su pregunta con la información adecuada podría ayudar a otros a ayudarlo con eso. –
@NikitaVolkov Estoy de acuerdo contigo. La reflexión es mala. Pero si se resuelve en tiempo de compilación, entonces no hay ninguna razón para reducir el rendimiento ni perder la seguridad de tipo. –
La reflexión no puede resolverse en tiempo de compilación, ya que el objetivo es introspectar su programa en tiempo de ejecución. Desde 2.10 hay una función de macros en Scala, pero al ser capaz de resolver su problema en tiempo de compilación definitivamente parece ser una exageración. No soy un experto en eso, así que no puedo ayudarte con eso. Y, por cierto, en el estado actual, su pregunta es muy amplia y es probable que esté cerrada. Es difícil obtener lo que en realidad estás preguntando aquí. –