2011-10-09 18 views
9

¿Cuál es la diferencia entre los tipos de las dos funciones siguientes?Diferencia entre tipos curry similares en Scala

def add1: Int => Int => Int = a => b => a + b 
def add2(a: Int)(b: Int) = a + b 

Según sus declaraciones, parecen tener el mismo tipo. Ambos son llamados de la misma manera:

scala> add1(1)(2) 
res2: Int = 3 

scala> add2(1)(2) 
res3: Int = 3 

Sin embargo, hay una aparente diferencia en sus tipos:

scala> :t add1 
Int => Int => Int 

scala> :t add2 
(a: Int)(b: Int)Int 

Además, la aplicación parcial de add1 es un poco más limpio que el de add2.

scala> add1(1) 
res4: Int => Int = <function1> 

scala> add2(1)(_) 
res5: Int => Int = <function1> 

Respuesta

1

Sin duda hay una diferencia entre las dos definiciones. Considere pasar a cada uno un solo argumento.

add1(1) 
(Int) => Int = <function1> 

add2(1) 
<console>:9: error: missing arguments for method add2 in object $iw; 
follow this method with `_' if you want to treat it as a partially applied function 
     add2(1) 

Sin embargo, si aplica parcialmente add2, tiene el mismo tipo que add1.

scala> :t add1 
(Int) => (Int) => Int 

scala> :t add2 _ 
(Int) => (Int) => Int 

I understand add1 perfectly well. Es una función anónima que toma un Int y regresa e Int => Int. Esta es la definición clásica de una función al curry.

Necesito leer más antes de entender add2 perfectamente. Por lo que puedo decir, es un método para escribir funciones que toman sus parámetros en una forma diferente (es decir, add2(1)(2)) y puede transformarse fácilmente en una función curried (add2 _).

Espero que esto ayude! También espero una mejor explicación sobre add2.

Editar: esta es una gran documento sobre los métodos de curry en Scala: http://www.codecommit.com/blog/scala/function-currying-in-scala

1

x.add1 es una función Int => Int => Int.

x.add2 es un método, que no es un valor y no tiene el mismo tipo que add1. Para obtener un objeto equivalente a x.add1, debe usar x.add2 _.

Cuestiones relacionadas