Si usted está pensando en una aplicación parcial, pensé que esto sólo era posible con múltiples listas de parámetros (mientras que sólo tiene una):
def plus(x: Int)(y: Int) = x + y //x and y in different parameter lists
val plus10 = plus(10) _ //_ indicates partial application
println(plus10(2)) //prints 12
Su ejemplo es interesante, ya que me estaba completamente inconsciente de la sintaxis que describes y parece que puede tener una aplicación parcial con una única lista de parámetros:
scala> def plus2(x: Int, y: Int) = x + y
plus2: (x: Int,y: Int)Int
scala> val anon = plus2(_,_)
anon: (Int, Int) => Int = <function2>
scala> anon(3, 4)
res1: Int = 7
lo que el compilador puede deducir claramente el tipo Int
!
scala> val anon2 = plus2(20,_)
<console>:5: error: missing parameter type for expanded function ((x$1) => plus2(20, x$1))
val anon2 = plus2(20,_)
^
Hmmm, extraño! No parece poder hacer una aplicación parcial con una sola lista de parámetros. ¡Pero luego si declaro el tipo del segundo parámetro, I puede tiene aplicación parcial!
scala> val anon2 = plus2(20,_: Int)
anon2: (Int) => Int = <function1>
scala> anon2(24)
res2: Int = 44
EDITAR - Lo único que puedo observar es que parece que los siguientes dos mantecas son equivalentes, en cuyo caso es un poco más obvio que esto no es una "aplicación parcial", sino más bien como un " función de puntero"
val anon1 = plus2(_,_)
val anon2 = plus2 _
¿Puedes dar un ejemplo de código real de lo que intentas hacer? Usted dice que esto "no compila" - * ¿en qué contexto? * –
Gracias por su respuesta. En realidad, no estoy usando este tipo de fragmento de código en la práctica, pero me encontré con el problema simplemente mientras jugaba con la sintaxis del marcador de posición de Scala. La última parte de tu respuesta describe bastante bien lo que estaba tratando de hacer. –
Parece una limitación arbitraria de la implementación del tipo inferencer. La verdad se encuentra en algún lugar aquí: http://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/compiler/scala/tools/nsc/typechecker/Infer.scala – retronym