2012-06-04 19 views
7

Después de haber descubierto que currying multi parameter-groups method is possible, estoy tratando de obtener una función parcialmente aplicada que requiere parámetros implícitos.Scala, Currying en el método de grupo de parámetros múltiples que incluye parámetros implícitos?

No es posible hacer esto. Si no, ¿podrías explicarme por qué?

scala> def sum(a: Int)(implicit b: Int): Int = { a+b } 
sum: (a: Int)(implicit b: Int)Int 

scala> sum(3)(4) 
res12: Int = 7 

scala> val partFunc2 = sum _ 
<console>:8: error: could not find implicit value for parameter b: Int 
     val partFunc2 = sum _ 
        ^

uso un objeto singleton para crear esta función aplicada parcialmente y quiero utilizarlo en un ámbito de aplicación donde se define el int implícito.

Respuesta

8

Esto se debe a que no tiene un alcance de Int implícito. Ver:

scala> def foo(x: Int)(implicit y: Int) = x + y 
foo: (x: Int)(implicit y: Int)Int 

scala> foo _ 
<console>:9: error: could not find implicit value for parameter y: Int 
       foo _ 
      ^

scala> implicit val b = 2 
b: Int = 2 

scala> foo _ 
res1: Int => Int = <function1> 

Lo implícito se reemplaza con un valor real por el compilador. Si curry el método, el resultado es una función y las funciones no pueden tener parámetros implícitos, por lo que el compilador tiene que insertar el valor en el momento en que curry el método.

edición:

Por su caso de uso, ¿por qué no intentar algo como:

object Foo { 
    def partialSum(implicit x: Int) = sum(3)(x) 
} 
+0

Gracias. Pero como dije, necesito declarar esta función en otro objeto singleton. Necesito declararlo fuera del contexto donde lo uso. – iwalktheline

+0

editó mi publicación. Creo que no hay otra forma de hacerlo, por las razones que ya mencioné. – drexin

+0

Tienes razón. Como currying da Function y Function no permite params implícitos, necesito enumerar explícitamente los params de uno de los dos grupos. – iwalktheline

0
scala> object MySingleton { 
| def sum(a: Int)(implicit b: Int): Int = { a+b } 
| 
| 
| def caller(a: Int) = { 
|  implicit val b = 3; // This allows you to define the partial below 
|  def pf = sum _  // and call sum()() without repeating the arg list. 
|  pf.apply(a) 
| } 
| } 
defined module MySingleton 


scala> MySingleton.caller(10) 
res10: Int = 13 
+3

¡Bienvenido a SO! Por favor, considere dejar alguna explicación intuitiva, en lugar de simplemente publicar el código. – vefthym

Cuestiones relacionadas