Soy bastante nuevo en el lenguaje de programación Scala, y estaba intentando algo en mi mente mientras estaba siguiendo las notas de la conferencia al here.Entender el operador de llamadas y contras del método infix (: :) en Scala
Creo que realmente no podía entender cómo funciona contras operador, aquí hay algunas cosas que intenté:
que he creado un generador de números pseudo-aleatorios, luego trató de crear una lista de un valor aleatorio:
scala> val gen = new java.util.Random
gen: java.util.Random = [email protected]
scala> gen nextInt 3 :: Nil
<console>:7: error: type mismatch;
found : List[Int]
required: Int
gen nextInt 3 :: Nil
^
Pero intentó pasar la Lista (3) al método siguiente. Cuando solía paratheses, no había ningún problema
scala> (gen nextInt 3) :: Nil
res69: List[Int] = List(1)
tenía curiosidad acerca de la orden de ejecución, por lo que creó una función para comprobar que
scala> def pr(i:Int):Int = { println(i); i }
pr: (i: Int)Int
scala> pr(1) :: pr(2) :: pr(3) :: Nil
1
2
3
res71: List[Int] = List(1, 2, 3)
Como se ve en las salidas, orden de ejecución es el mismo que el orden de aparición Entonces pensé que podría ser sobre la función 'nextInt', entonces intenté siguiente:
scala> 1 + 2 :: Nil
res72: List[Int] = List(3)
En primer lugar, ejecutados Además, y después de que los contras se ejecuta. Entonces aquí está la pregunta: ¿Cuál es la diferencia entre gen nextInt 3 :: Nil
y 1 + 2 :: Nil
?
Gracias por su respuesta detallada, también me dio muchas pistas sobre muchas otras cosas. Pero tengo una pregunta más: ¿Cómo interpreta el compilador la expresión en la sección del tercer código que di en mi pregunta inicial; en términos de paréntesis? porque usar la función pr mostró que los términos se ejecutan en el orden de izquierda a derecha. – ciuncan
Correcto, las llamadas a funciones se evalúan de izquierda a derecha. Esto es porque 'pr (X)' son las expresiones de argumento de '::' y estas se evalúan primero en orden de aparición y luego el valor se pasa al método. 'pr (1) :: pr (2) :: pr (3) :: Nil' prints 1 2 3. Pero' Nil.::(pr(3)).::(pr(2)). : :(pr (1)) 'imprime 3 2 1. Pero ambos regresan' List (1, 2, 3) ' –
@ciuncan No lo sé. Es posible que la notación del operador con la corrección correcta permita una orden de evaluación que no sea posible con la notación de puntos, o podría ser que el compilador optimice las llamadas '::' pero tenga un error relacionado con el orden de la evaluación. –