-
Notifications
You must be signed in to change notification settings - Fork 1k
Spanish: New translations and some minor changes #1697
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,12 +10,35 @@ next-page: automatic-closures | |
previous-page: nested-functions | ||
--- | ||
|
||
_Nota de traducción: Currying es una técnica de programación funcional nombrada en honor al matemático y lógico Haskell Curry. Es por eso que no se intentará hacer ninguna traducción sobre el término Currying. Entiendase este como una acción, técnica base de PF. Como una nota al paso, el lenguaje de programación Haskell debe su nombre a este eximio matemático._ | ||
_Nota de traducción: Currying es una técnica de programación funcional nombrada en honor al matemático y lógico Haskell Curry. Es por eso que no se intentará hacer ninguna traducción sobre el término Currying. Entiéndase este como una acción, técnica base de PF. Como una nota al paso, el lenguaje de programación Haskell debe su nombre a este eximio matemático._ | ||
|
||
Los métodos pueden definir múltiples listas de parámetros. Cuando un método es invocado con un número menor de listas de parámetros, en su lugar se devolverá una función que toma las listas faltantes como sus argumentos. | ||
|
||
Aquí se muestra un ejemplo: | ||
### Ejemplos | ||
|
||
A continuación hay un ejemplo, tal y como se define en el trait `TraversableOnce` en el API de colecciones de Scala: | ||
|
||
``` | ||
def foldLeft[B](z: B)(op: (B, A) => B): B | ||
``` | ||
|
||
`foldLeft` aplica una función (que recibe dos parámetros) `op` a un valor inicial `z` y todos los elementos de esta colección, de izquierda a derecha. A continuación se muestra un ejemplo de su uso. | ||
|
||
Comenzando con un valor inicial 0, `foldLeft` aplica la función `(m, n) => m + n` a cada uno de los elementos de la lista y al valor acumulado previo. | ||
|
||
{% scalafiddle %} | ||
```tut | ||
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) | ||
val res = numbers.foldLeft(0)((m, n) => m + n) | ||
println(res) // 55 | ||
``` | ||
{% endscalafiddle %} | ||
|
||
|
||
A continuación se muestra otro ejemplo: | ||
|
||
{% scalafiddle %} | ||
```tut | ||
alvarag marked this conversation as resolved.
Show resolved
Hide resolved
|
||
object CurryTest extends App { | ||
|
||
def filter(xs: List[Int], p: Int => Boolean): List[Int] = | ||
|
@@ -29,10 +52,78 @@ Aquí se muestra un ejemplo: | |
println(filter(nums, modN(2))) | ||
println(filter(nums, modN(3))) | ||
} | ||
``` | ||
{% endscalafiddle %} | ||
|
||
_Nota: el método `modN` está parcialmente aplicado en las dos llamadas a `filter`; esto significa que solo su primer argumento es realmente aplicado. El término `modN(2)` devuelve una función de tipo `Int => Boolean` y es por eso un posible candidato para el segundo argumento de la función `filter`_ | ||
_Nota: el método `modN` está parcialmente aplicado en las dos llamadas a `filter`; esto significa que solo su primer argumento es realmente aplicado. El término `modN(2)` devuelve una función de tipo `Int => Boolean` y es por eso un posible candidato para el segundo argumento de la función `filter`._ | ||
alvarag marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
Aquí se muestra la salida del programa anterior: | ||
|
||
List(2,4,6,8) | ||
List(3,6) | ||
|
||
|
||
### Casos de uso | ||
|
||
Casos de uso sugeridos para múltiples listas de parámetros incluyen: | ||
|
||
#### Inferencia de tipos | ||
|
||
En Scala, la inferencia de tipos se realiza parámetro a parámetro. | ||
Suponer que se dispone del siguiente método: | ||
|
||
```tut | ||
def foldLeft1[A, B](as: List[A], b0: B, op: (B, A) => B) = ??? | ||
``` | ||
|
||
Si se invoca de la siguiente manera, se puede comprobar que no compila correctamente: | ||
|
||
```tut:fail | ||
def notPossible = foldLeft1(numbers, 0, _ + _) | ||
``` | ||
|
||
Debes invocarlo de alguna de las maneras propuestas a continuación: | ||
|
||
```tut | ||
def firstWay = foldLeft1[Int, Int](numbers, 0, _ + _) | ||
def secondWay = foldLeft1(numbers, 0, (a: Int, b: Int) => a + b) | ||
``` | ||
|
||
Esto se debe a que Scala no será capaz de inferir el tipo de la función `_ + _`, como está aún infiriendo `A` y `B`. | ||
Moviéndo el parámetro `op` a su propia lista de parámetros, los tipos de `A` y `B` son inferidos en la primera lista de parámetros. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Mispring: The term "Moviéndo" in spanish does not have accent mark (it has to be Moviendo). |
||
Una vez se han inferido sus tipos, estos están disponibles para la segunda lista de parámetros y `_ + _ ` podrá casar con los tipos inferidos `(Int, Int) => Int` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Mispring: The term "estos" in that spanish context, do have accent mark (it has to be éstos). |
||
|
||
```tut | ||
def foldLeft2[A, B](as: List[A], b0: B)(op: (B, A) => B) = ??? | ||
def possible = foldLeft2(numbers, 0)(_ + _) | ||
``` | ||
|
||
Esta definición no necesita de ninguna pista adicional y puede inferir todos los tipos de los parámetros. | ||
|
||
|
||
#### Parámetros implícitos | ||
|
||
Para especificar solamente ciertos parámetros como [`implicit`](https://docs.scala-lang.org/tour/implicit-parameters.html), ellos deben ser colocados en su propia lista de parámetros implícitos (`implicit`). | ||
|
||
Un ejemplo de esto se muestra a continuación: | ||
|
||
``` | ||
def execute(arg: Int)(implicit ec: scala.concurrent.ExecutionContext) = ??? | ||
``` | ||
|
||
#### Aplicación parcial | ||
|
||
Cuando un método es invocado con menos parámetros que los que están declarados en la definición del método, esto generará una función que toma los parámetros faltantes como argumentos. Esto se conoce formalmente como [aplicación parcial](https://en.wikipedia.org/wiki/Partial_application). | ||
|
||
Por ejemplo, | ||
|
||
```tut | ||
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) | ||
val numberFunc = numbers.foldLeft(List[Int]()) _ | ||
|
||
val squares = numberFunc((xs, x) => xs :+ x*x) | ||
println(squares) // List(1, 4, 9, 16, 25, 36, 49, 64, 81, 100) | ||
|
||
val cubes = numberFunc((xs, x) => xs :+ x*x*x) | ||
println(cubes) // List(1, 8, 27, 64, 125, 216, 343, 512, 729, 1000) | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,15 +10,15 @@ next-page: basics | |
|
||
--- | ||
|
||
Scala es un lenguaje de programación moderno multi-paradigma diseñado para expresar patrones de programación comunes de una forma concisa, elegante, y de tipado seguro. Integra fácilmente características de lenguajes orientados a objetos y funcionales. | ||
Scala es un lenguaje de programación moderno multi-paradigma diseñado para expresar patrones de programación comunes de una forma concisa, elegante, y con tipado seguro. Integra fácilmente características de lenguajes orientados a objetos y funcionales. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In this context "con" is a better choice. |
||
|
||
## Scala es orientado a objetos ## | ||
Scala es un lenguaje puramente orientado a objetos en el sentido de que todo es un objeto. Los tipos y comportamientos de objetos son descritos por [clases](classes.html) y [traits](traits.html) (que podría ser traducido como un "rasgo"). Las clases pueden ser extendidas a través de subclases y un mecanismo flexible [de composición mezclada](mixin-class-composition.html) que provee un claro remplazo a la herencia múltiple. | ||
|
||
## Scala es funcional ## | ||
Scala es también un lenguaje funcional en el sentido que toda función es un valor. Scala provee una sintaxis ligera para definir funciones anónimas. Soporta [funciones de primer orden](higher-order-functions.html), permite que las funciones sean [anidadas](nested-functions.html), y soporta [currying](multiple-parameter-lists.html). Las [clases caso](case-classes.html) de Scala y las construcciones incorporadas al lenguaje para [reconocimiento de patrones](pattern-matching.html) modelan tipos algebráicos usados en muchos lenguajes de programación funcionales. | ||
Scala es también un lenguaje funcional en el sentido que toda función es un valor. Scala provee una sintaxis ligera para definir funciones anónimas. Soporta [funciones de orden superior](higher-order-functions.html), permite funciones [anidadas](nested-functions.html), y soporta [currying](multiple-parameter-lists.html). Las [clases Case](case-classes.html) de Scala y las construcciones incorporadas al lenguaje para [reconocimiento de patrones](pattern-matching.html) modelan tipos algebraicos usados en muchos lenguajes de programación funcionales. | ||
|
||
Además, la noción de reconocimiento de patrones de Scala se puede extender naturalmente al procesamiento de datos XML con la ayuda de [patrones de expresiones regulares](regular-expression-patterns.html). En este contexto, seq comprehensions resultan útiles para formular consultas. Estas características hacen a Scala ideal para desarrollar aplicaciones como Web Services. | ||
Además, la noción de reconocimiento de patrones de Scala se puede extender naturalmente al procesamiento de datos XML con la ayuda de [patrones de expresiones regulares](regular-expression-patterns.html). En este contexto, la compresión de bucles `for` resultan útiles para formular consultas. Estas características hacen a Scala un lenguaje ideal para desarrollar aplicaciones como Web Services. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good, It achieves coherence with the rest of the tour (for comprehensions section) |
||
|
||
## Scala estáticamente tipado ## | ||
Scala cuenta con un expresivo sistema de tipado que fuerza estáticamente las abstracciones a ser usadas en una manera coherente y segura. En particular, el sistema de tipado soporta: | ||
|
@@ -31,16 +31,25 @@ Scala cuenta con un expresivo sistema de tipado que fuerza estáticamente las ab | |
* [implicit conversions](implicit-conversions.html) | ||
* [métodos polimórficos](polymorphic-methods.html) | ||
|
||
El [mecanismo de inferencia de tipos locales](type-inference.html) se encarga de que el usuario no tenga que anotar el programa con información redundante de tipado. Combinadas, estas características proveen una base poderosa para el reuso seguro de abstracciones de programación y para la extensión segura (en cuanto a tipos) de software. | ||
El [mecanismo de inferencia de tipos locales](type-inference.html) se encarga de que el usuario no tenga que anotar el programa con información redundante de tipado. Combinadas, estas características proveen una base poderosa para la reutilización segura de abstracciones de programación y para la extensión segura (en cuanto a tipos) de software. | ||
alvarag marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
## Scala es extensible ## | ||
|
||
En la práctica el desarrollo de aplicaciones específicas para un dominio generalmente requiere de "Lenguajes de dominio específico" (DSL). Scala provee una única combinación de mecanismos del lenguaje que simplifican la creación de construcciones propias del lenguaje en forma de librerías: | ||
En la práctica, el desarrollo de aplicaciones específicas para un dominio generalmente requiere de "Lenguajes de dominio específico" (DSL). Scala provee una única combinación de mecanismos del lenguaje que simplifican la creación de construcciones propias del lenguaje en forma de bibliotecas: | ||
alvarag marked this conversation as resolved.
Show resolved
Hide resolved
|
||
* cualquier método puede ser usado como un operador de [infijo o postfijo](operators.html) | ||
* [las closures son construidas automáticamente dependiendo del tipo esperado](automatic-closures.html) (tipos objetivo). | ||
|
||
El uso conjunto de ambas características facilita la definición de nuevas sentencias sin tener que extender la sintaxis y sin usar facciones de meta-programación como tipo macros. | ||
|
||
Scala está diseñado para interoperar bien con el popular Entorno de ejecución de Java 2 (JRE). En particular, la interacción con el lenguaje orientado a objetos Java es muy sencillo. Scala tiene el mismo esquema de compilación (compilación separada, carga de clases dinámica) que java y permite acceder a las miles de librerías de gran calidad existentes. | ||
## Scala interopera | ||
|
||
Scala está diseñado para interoperar correctamente con la popular Java Runtime Environment (JRE). | ||
En particular, es posible la misma interacción con el lenguaje de programación Java. | ||
Nuevas características de Java como SAMs, [lambdas](higher-order-functions.html), [anotaciones](annotations.html), y [clases genéricas](generic-classes.html) tienen sus análogos en Scala. | ||
|
||
Aquellas características de Scala que no tienen analogías en Java, como por ejemplo [parámetros por defecto](default-parameter-values.html) y [parámetros con nombre](named-arguments.html), compilan de una forma tan similar a Java como es razonablemente posible. | ||
Scala tiene el mismo modelo de compilación (compilación separada, carga de clases dinámica) que Java y permite acceder a miles de bibliotecas de alta calidad ya existentes. | ||
|
||
## ¡Disfruta el tour! | ||
|
||
Por favor continúe a la próxima página para conocer más. |
Uh oh!
There was an error while loading. Please reload this page.