Perdóneme si esto ya se ha pedido en otro lugar. Tengo una pregunta de sintaxis de Scala que involucra valores-función y parámetros implícitos.Scala Literales funcionales con Implicits
Me siento cómodo al usar implícitos con la característica de curvar de Scala. Por ejemplo, si tuviera una función de suma y quería hacer el segundo argumento implícito:
scala> def sum(a: Int)(implicit b: Int) = a + b
sum: (a: Int)(implicit b: Int)Int
¿Hay una manera de hacer esto utilizando la sintaxis de la función valor? Haciendo caso omiso de lo implícito por un momento, yo normalmente escribo valores de función al curry así:
scala> val sum2 = (a: Int) => (b: Int) => a + b
sum: (Int) => (Int) => Int = <function1>
Sin embargo, la firma de la función en el segundo enfoque es muy diferente (la currificación se expresa de forma explícita). Simplemente añadiendo la palabra clave implícita a B no tiene mucho sentido y el compilador se queja así:
scala> val sum2 = (a: Int) => (implicit b: Int) => a + b
<console>:1: error: '=>' expected but ')' found.
val sum2 = (a: Int) => (implicit b: Int) => a + b
^
Por otra parte, la aplicación de suma desde el primer enfoque para obtener una función de valor hace que los problemas así:
scala> val sumFunction = sum _
<console>:14: error: could not find implicit value for parameter b: Int
val sumFunction = sum _
^
Esto me lleva a pensar que las funciones que tienen parámetros implícitos deben haber dicho parámetros determinan cuando se creó la función de valor, no cuando se aplica la función valor más adelante. ¿Es este realmente el caso? ¿Alguna vez puedes usar un parámetro implícito con un valor de función?
¡Gracias por la ayuda!
Por desgracia, no tengo una respuesta para usted, pero tengo una pregunta aclaratoria: en su segundo párrafo se habla de un 'sum' * * función, pero su ejemplo de código correspondiente muestra un' sum' *método*. ¿A cuál te refieres? –
Hola Jörg: entiendo que un método es simplemente una función asociada a una clase u objeto. Todas las funciones anteriores se escribieron en Scala REPL; no se crearon clases u objetos definidos por el usuario. Entonces diría que solo estamos lidiando con funciones aquí. – shj