Skip to content

Commit

Permalink
Merge pull request #49 from ferllop/master
Browse files Browse the repository at this point in the history
General translation improvement and autogenerate summary
  • Loading branch information
EstebanMarin authored Jun 1, 2023
2 parents cbbff04 + d3d0890 commit d4679cd
Show file tree
Hide file tree
Showing 23 changed files with 473 additions and 414 deletions.
42 changes: 42 additions & 0 deletions .generate-summary.pl
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#!/usr/bin/env perl -n
use Encode;
use utf8;
use open ':encoding(UTF-8)', ':std';

# This stupid function makes to decode only the first file.
# If I don't do this, perl is not doing it by himself and I don't know why.
# Even the headers of this file are telling to use utf8 encoding!
# But does not do it in the first file that reads.
# And you do it in all the files it inverts to only be ok in the first file. PFFF
# Two hours of research is enough!
# At least... The function is pure!!
sub decode_if_is_file {
my ($first_file, $line) = @_;
return ($ARGV eq $first_file) ? decode_utf8($line) : $line;
}

BEGIN {
print "# Sumario\n\n";
}

# Trim whitespace
s/^\s+|\s+$//g;

# Print headlines
if (/^# (.*)/) {
$headline = decode_if_is_file("README.md", $1);
print "* [$headline]($ARGV)\n";
}

# Print subheadlines
if (/^## (.*)/) {
$subheadline = decode_if_is_file("README.md", $1);
my $anchor = lc $subheadline;

# Remove all but word characters and whitespace
$anchor =~ s/[^\wö ]//g;
# Replace whitespace with dashes
$anchor =~ tr/ /-/d;

print " * [$subheadline]($ARGV#$anchor)\n";
}
4 changes: 4 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ jobs:
run: |
sudo apt install -y xfonts-scalable
npm run generate-cover
- name: Generate summary
run: |
npm run generate-summary
- name: Setup gitbook
run: |
Expand Down
10 changes: 5 additions & 5 deletions FAQ-es.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ En una firma, como:

`map :: Functor f => (a -> b) -> f a -> f b`

`f` se refiere a un `functor` que puede ser, por ejemplo, Maybe o IO. Así pues, la firma
abstrae la elección de ese functor mediante el uso de una variable de tipo, lo que básicamente
significa que cualquier functor puede ser usado donde aparece `f` siempre que todas las `f`
`f` se refiere a un `funtor` que puede ser, por ejemplo, Maybe o IO. Así pues, la firma
abstrae la elección de ese funtor mediante el uso de una variable de tipo, lo que básicamente
significa que cualquier funtor puede ser usado donde aparece `f` siempre que todas las `f`
sean del mismo tipo (si el primer `f a` en la firma representa un `Maybe a`, entonces el
segundo **no puede referirse a** un `IO b` si no que debe referirse a un `Maybe b`). Por ejemplo:

Expand All @@ -55,7 +55,7 @@ let maybeNumber = map(f, maybeString) // Maybe(6)

> ver [#77], [#192]
Si aún no has llegado, puedes echar un vistazo al [Capítulo 6](https://github.com/MostlyAdequate/mostly-adequate-guide/blob/master/ch06.md), el cual presenta una aplicación sencilla sobre flick
Si aún no has llegado, puedes echar un vistazo al [Capítulo 6](https://github.com/MostlyAdequate/mostly-adequate-guide-es/blob/master/ch06-es.md), el cual presenta una aplicación sencilla sobre flick
Pronto llegarán otros ejemplos. Por cierto, ¡eres libre de compartir con nosotros tu experiencia!

### ¿Por qué el libro utiliza ES5? ¿Hay disponible alguna versión con ES6?
Expand Down Expand Up @@ -83,7 +83,7 @@ información sobre la función reduce.
El libro está escrito en su propio estilo, lo cual contribuye a hacerlo consistente como un todo. Si
no estás familiarizado con el inglés, puedes verlo como un buen entrenamiento.
Sin embargo, si alguna vez necesitas ayuda para entender algún significado, ahora
hay [numerosas traducciones](https://github.com/MostlyAdequate/mostly-adequate-guide/blob/master/TRANSLATIONS.md)
hay [numerosas traducciones](https://github.com/MostlyAdequate/mostly-adequate-guide-es/blob/master/TRANSLATIONS-es.md)
disponibles que probablemente te sean de ayuda.

### ¿Qué es Either? ¿Qué es Future? ¿Qué es Task?
Expand Down
23 changes: 14 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,25 +1,30 @@
[![cover](images/cover.png)](SUMMARY.md)

# Introducción

## Sobre este libro

Este es un libro sobre el paradigma funcional en general. Utilizaremos el lenguaje de programación funcional más popular del mundo: JavaScript. Algunos pueden pensar que es una mala elección, ya que va en contra de la cultura que, por el momento, se siente predominantemente imperativa. Sin embargo, creo que esta es la mejor forma de aprender PF por diversas razones:
Este es un libro sobre el paradigma funcional en general. Utilizaremos el lenguaje de programación funcional más popular del mundo: JavaScript. Algunos pueden pensar que es una mala elección, ya que va en contra de la cultura que, por el momento, es predominantemente imperativa. Sin embargo, creo que esta es la mejor forma de aprender programación funcional por diversas razones:

* **Seguramente lo utilizes cada día en el trabajo.**

Esto hace posible practicar y aplicar cada día en programas del mundo real los conocimientos adquiridos en vez de en proyectos de una sola noche o de un fin de semana con un lenguaje de PF esotérico.
Esto hace posible practicar y aplicar cada día en programas del mundo real los conocimientos adquiridos en vez de en proyectos de una sola noche o de un fin de semana con un lenguaje de programación funcional esotérico.


* **No tenemos que aprenderlo todo desde cero para empezar a escribir programas**
* **No tenemos que aprenderlo todo desde cero para empezar a escribir programas.**

En un lenguaje funcional puro, no puedes registrar una variable o leer un nodo DOM sin usar mónadas. Aquí podemos hacer un poco de trampas mientras aprendemos a purificar nuestra base de código. También es más fácil empezar con este lenguaje debido a su paradigma mixto y a que te puedes apoyar en lo que ya conoces mientras haya huecos en tu conocimiento.


* **El lenguaje está completamente capacitado para escribir código funcional de primera categoría.**

Tenemos todas las características necesarias para imitar a un lenguaje como Scala o Haskell con la ayuda de una o dos pequeñas librerías. La programación orientada a objetos domina actualmente la industria, pero es claramente torpe en JavaScript. Es similar a acampar en una autopista o bailar claqué con botas de agua. Tenemos que hacer `bind` en todos los lados para que `this` no cambie sin nosotros saberlo, tenemos varias soluciones para el extraño comportamiento cuando olvidas usar `new`, los miembros privados solo están disponibles mediante closures. Para muchos de nosotros, la PF parece más natural de todos modos.
Tenemos todas las características necesarias para imitar a un lenguaje como Scala o Haskell con la ayuda de una o dos pequeñas librerías. La programación orientada a objetos domina actualmente la industria, pero es claramente torpe en JavaScript. Es similar a acampar en una autopista o bailar claqué con botas de agua. Tenemos que usar `bind` por todas partes para que `this` no cambie sin nosotros saberlo, tenemos varias soluciones para el extraño comportamiento cuando olvidas usar `new`, los miembros privados solo están disponibles mediante closures. Para muchos de nosotros, la programación funcional parece más natural de todos modos.

Dicho esto, los lenguajes funcionales tipados serán, sin ninguna duda, el mejor lugar para programar con el estilo que se presenta en este libro. JavaScript será nuestro medio para aprender un paradigma, dónde lo apliques depende de tí. Afortunadamente, las interfaces son matemáticas y, como tal, ubicuas. Te sentirás como en casa con Swiftz, Scalaz, Haskell, PureScript, y otros entornos inclinados hacia las matemáticas.

Dicho esto, lenguajes funcionales tipados serán, sin duda alguna, el mejor lugar para programar con el estilo que se presenta en este libro. JavaScript será nuestro medio para aprender un paradigma, dónde lo apliques depende de tí. Afortunadamente, las interfaces son matemáticas y, como tal, ubicuas. Te sentirás como en casa con Swiftz, Scalaz, Haskell, PureScript, y otros entornos inclinados hacia las matemáticas.
## Sobre la traducción

Se han añadido notas de traducción donde se ha visto necesario. Para no interferir con el ritmo de la lectura se ha optado por incluir la nota entre corchetes y en cursiva seguidamente de aquello que se esté anotando. Por ejemplo, "solo necesitas saber cómo encontrar y matar algunos bugs [*bichos*]". En caso de anotar un título la anotación se incluirá al comienzo del párrafo que le siga.

## Léelo Online

Expand All @@ -32,7 +37,7 @@ Para una mejor experiencia de lectura, [léelo online a través de Gitbook](http

## Juega Con el Código

Para que el entrenamiento sea más efectivo y no aburrirte demasiado cuando te estoy contando otra historia, asegúrate de jugar con los conceptos introducidos en este libro. Algunos pueden ser difíciles de entender a la primera y se comprenden mejor cuándo te ensucias las manos.
Para que el entrenamiento sea más efectivo y que no te aburras demasiado cuando te esté contando otra historia, asegúrate de jugar con los conceptos introducidos en este libro. Algunos pueden ser difíciles de entender a la primera y se comprenden mejor cuándo te ensucias las manos.
Todas las funciones y estructuras de datos algebraicas presentadas en el libro están reunidas en los apéndices. El correspondiente código también está disponible como un módulo de npm:

```bash
Expand Down Expand Up @@ -65,7 +70,7 @@ npm run generate-epub
> ¡Nota! Para generar la versión ebook necesitarás instalar `ebook-convert`. [Instrucciones de
> instalación](https://gitbookio.gitbooks.io/documentation/content/build/ebookconvert.html).
# Contenido
## Contenido

Ver [SUMMARY-es.md](SUMMARY-es.md)

Expand All @@ -83,10 +88,10 @@ Ver [FAQ-es.md](FAQ-es.md)



# Planes para el futuro
## Planes para el futuro

* **Parte 1** (capítulos 1-7) es una guía básica. La actualizaré a medida que encuentre errores, ya que esto es un borrador inicial. ¡Siéntete libre de ayudar!
* **Parte 2** (capítulos 8-13) aborda clases de tipos como functores y mónadas de forma transversal. Espero poder meterme con transformers y con una aplicación pura.
* **Parte 2** (capítulos 8-13) aborda de forma transversal clases de tipos, como funtores y mónadas. Espero poder meterme con transformers y con una aplicación pura.
* **Parte 3** (capítulos 14+) cruzará la delgada línea entre la programación práctica y la absurdidad académica. Veremos comónadas, f-algebras, mónadas libres, yoneda, y otras construcciones categóricas.


Expand Down
51 changes: 29 additions & 22 deletions SUMMARY-es.md
Original file line number Diff line number Diff line change
@@ -1,73 +1,78 @@
# Sumario

* [Introducción](README.md)
* [Sobre este libro](README.md#sobre-este-libro)
* [Sobre la traducción](README.md#sobre-la-traducción)
* [Léelo Online](README.md#léelo-online)
* [Juega Con el Código](README.md#juega-con-el-código)
* [Descárgalo](README.md#descárgalo)
* [Hazlo tú mismo](README.md#hazlo-tú-mismo)
* [Contenido](README.md#contenido)
* [Planes para el futuro](README.md#planes-para-el-futuro)
* [Capítulo 01: ¿Qué Estamos Haciendo?](ch01-es.md)
* [Presentaciones](ch01-es.md#presentaciones)
* [Un Breve Encuentro](ch01-es.md#un-breve-encuentro)
* [Capítulo 02: Funciones de Primera Clase](ch02-es.md)
* [Un repaso rápido](ch02-es.md#un-repaso-rapido)
* [¿Por Qué Favorecer a las Funciones de Primera Clase?](ch02-es.md#por-que-favorecer-a-las-funciones-de-primera-clase)
* [Un Repaso Rápido](ch02-es.md#un-repaso-rápido)
* [¿Por Qué Favorecer a las Funciones de Primera Clase?](ch02-es.md#por-qué-favorecer-a-las-funciones-de-primera-clase)
* [Capítulo 03: Pura Felicidad con Funciones Puras](ch03-es.md)
* [Oh Ser Puro Otra Vez](ch03-es.md#oh-ser-puro-otra-vez)
* [Los Efectos Secundarios Pueden Incluir...](ch03-es.md#los-efectos-secundarios-pueden-incluir)
* [Matemáticas de Octavo Grado](ch03-es.md#matemáticas-de-octavo-grado)
* [Los Argumentos Para La Pureza](ch03-es.md#los-argumentos-para-la-pureza)
* [En Resumen](ch03-es.md#en-resumen)
* [Capítulo 04: Currying](ch04-es.md)
* [No puedo Vivir Si Vivir Es Sin Ti](ch04-es.md#no-puedo-vivir-si-vivir-es-sin-ti)
* [Más Que Un Juego De Palabras / Salsa Especial](ch04-es.md#más-que-un-juego-de-palabras--salsa-especial)
* [En Resumen](ch04-es.md#en-resumen)
* [Capítulo 04: Currificación](ch04-es.md)
* [No Puedo Vivir Si Vivir Es Sin Ti](ch04-es.md#no-puedo-vivir-si-vivir-es-sin-ti)
* [Más Que Un Juego de Palabras / Salsa Especial](ch04-es.md#más-que-un-juego-de-palabras--salsa-especial)
* [En resumen](ch04-es.md#en-resumen)
* [Ejercicios](ch04-es.md#ejercicios)
* [Capítulo 05: Programación Mediante Composición](ch05-es.md)
* [Ganadería Funcional](ch05-es.md#ganadería-funcional)
* [Capítulo 05: Programar Mediante Composición](ch05-es.md)
* [Cultivo Funcional](ch05-es.md#cultivo-funcional)
* [Pointfree](ch05-es.md#pointfree)
* [Depurando](ch05-es.md#depurando)
* [Teoría de Categorías](ch05-es.md#teoría-de-categorías)
* [En Resumen](ch05-es.md#en-resumen)
* [Ejercicios](ch05-es.md#ejercicios)
* [Capítulo 06: Aplicación de Ejemplo](ch06-es.md)
* [Programación Declarativa](ch06-es.md#programación-declarativa)
* [Un Flickr Hecho Con Programación Funcional](ch06-es.md#un-flickr-hecho-con-programación-funcional)
* [Un Flickr Con Programación Funcional](ch06-es.md#un-flickr-con-programación-funcional)
* [Una Refactorización Basada En Principios](ch06-es.md#una-refactorización-basada-en-principios)
* [En Resumen](ch06-es.md#en-resumen)
* [Capítulo 07: Hindley-Milner y Yo](ch07-es.md)
* [¿Cuál Es Tu Tipo?](ch07-es.md#cuál-es-tu-tipo)
* [Historias De Lo Críptico](ch07-es.md#historias-de-lo-críptico)
* [Cuentos De Lo Críptico](ch07-es.md#cuentos-de-lo-críptico)
* [Reduciendo las Posibilidades](ch07-es.md#reduciendo-las-posibilidades)
* [Teoremas Gratis](ch07-es.md#teoremas-gratis)
* [Teoremas Gratuitos](ch07-es.md#teoremas-gratuitos)
* [Restricciones](ch07-es.md#restricciones)
* [En Resumen](ch07-es.md#en-resumen)
* [Capítulo 08: Tupperware](ch08-es.md)
* [El Poderoso Contenedor](ch08-es.md#el-poderoso-contenedor)
* [Mi Primer Functor](ch08-es.md#mi-primer-functor)
* [Mi Primer Funtor](ch08-es.md#mi-primer-funtor)
* [El Maybe de Schrödinger](ch08-es.md#el-maybe-de-schrödinger)
* [Casos de Uso](ch08-es.md#casos-de-uso)
* [Liberando el Valor](ch08-es.md#liberando-el-valor)
* [Manejo de Errores Puro](ch08-es.md#manejo-de-errores-puro)
* [El Viejo McDonald Tuvo Efectos...](ch08-es.md#el-viejo-mcdonald-tuvo-efectos)
* [El Viejo McDonald Tenía Efectos...](ch08-es.md#el-viejo-mcdonald-tenía-efectos)
* [Tareas Asíncronas](ch08-es.md#tareas-asíncronas)
* [Un Poco de Teoría](ch08-es.md#un-poco-de-teoría)
* [En Resumen](ch08-es.md#en-resumen)
* [Ejercicios](ch08-es.md#ejercicios)
* [Capítulo 09: Cebollas Monádicas](ch09-es.md)
* [Fábrica de Functores Puntiagudos](ch09-es.md#fábrica-de-functores-puntiagudos)
* [Factoría de Funtores Punzantes](ch09-es.md#factoría-de-funtores-punzantes)
* [Mezclando Metáforas](ch09-es.md#mezclando-metáforas)
* [Mi Cadena Me Golpea El Pecho](ch09-es.md#mi-cadena-me-golpea-el-pecho)
* [Mi Cadena Golpea Mi Pecho](ch09-es.md#mi-cadena-golpea-mi-pecho)
* [Borrachera de Poder](ch09-es.md#borrachera-de-poder)
* [Teoría](ch09-es.md#teoría)
* [En Resumen](ch09-es.md#en-resumen)
* [Ejercicios](ch09-es.md#ejercicios)
* [Capítulo 10: Functores Aplicativos](ch10-es.md)
* [Capítulo 10: Funtores Aplicativos](ch10-es.md)
* [Aplicando Aplicativos](ch10-es.md#aplicando-aplicativos)
* [Barcos en Botellas](ch10-es.md#barcos-en-botellas)
* [Motivación para la Coordinación](ch10-es.md#motivación-para-la-coordinación)
* [Colega, ¿Alguna Vez Levantas?](ch10-es.md#colega-alguna-vez-levantas)
* [Operadores](ch10-es.md#operadores)
* [Abrelatas Gratis](ch10-es.md#abrelatas-gratis)
* [Leyes](ch10-es.md#leyes)
* [Identidad](ch10-es.md#identidad)
* [Homomorfismo](ch10-es.md#homomorfismo)
* [Intercambio](ch10-es.md#intercambio)
* [Composición](ch10-es.md#composición)
* [En Resumen](ch10-es.md#en-resumen)
* [Ejercicios](ch10-es.md#ejercicios)
* [Capítulo 11: Transforma Otra Vez, Naturalmente](ch11-es.md)
Expand All @@ -92,7 +97,7 @@
* [Capítulo 13: Los Monoides Lo Unen Todo](ch13-es.md)
* [Salvaje Combinación](ch13-es.md#salvaje-combinación)
* [Abstrayendo La Suma](ch13-es.md#abstrayendo-la-suma)
* [Todos Mis Functores Favoritos Son Semigrupos](ch13-es.md#todos-mis-functores-favoritos-son-semigrupos)
* [Todos Mis Funtores Favoritos Son Semigrupos](ch13-es.md#todos-mis-funtores-favoritos-son-semigrupos)
* [Monoides A Cambio De Nada](ch13-es.md#monoides-a-cambio-de-nada)
* [Doblando La Casa](ch13-es.md#doblando-la-casa)
* [No Un Monoide Exactamente](ch13-es.md#no-un-monoide-exactamente)
Expand All @@ -108,7 +113,8 @@
* [identity](appendix_a-es.md#identity)
* [inspect](appendix_a-es.md#inspect)
* [left](appendix_a-es.md#left)
* [liftA\*](appendix_a-es.md#lifta)
* [liftA2](appendix_a-es.md#lifta2)
* [liftA3](appendix_a-es.md#lifta3)
* [maybe](appendix_a-es.md#maybe)
* [nothing](appendix_a-es.md#nothing)
* [reject](appendix_a-es.md#reject)
Expand Down Expand Up @@ -139,6 +145,7 @@
* [prop](appendix_c-es.md#prop)
* [reduce](appendix_c-es.md#reduce)
* [replace](appendix_c-es.md#replace)
* [reverse](appendix_c-es.md#reverse)
* [safeHead](appendix_c-es.md#safehead)
* [safeLast](appendix_c-es.md#safelast)
* [safeProp](appendix_c-es.md#safeprop)
Expand Down
2 changes: 1 addition & 1 deletion appendix_a-es.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ const nothing = Maybe.of(null);
```


## reject
## reject

```js
// reject :: a -> Task a b
Expand Down
3 changes: 1 addition & 2 deletions appendix_b-es.md
Original file line number Diff line number Diff line change
Expand Up @@ -328,8 +328,7 @@ class Map {

## Maybe

> Note that `Maybe` could also be defined in a similar fashion as we did for `Either` with two
> child classes `Just` and `Nothing`. This is simply a different flavor.
> Ten en cuenta que `Maybe` también podría definirse con dos clases hijas `Just` y `Nothing`, de una manera similar a como lo hicimos con `Either`. Esta tan solo es una forma diferente.
```js
class Maybe {
Expand Down
6 changes: 3 additions & 3 deletions appendix_c-es.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Para encontrar funciones más preparadas para un entorno en producción, échale

Ten en cuenta que las funciones hacen referencia a las funciones `curry` y `compose` definidas en el [Apéndice A](./appendix_a-es.md)

## add
## add

```js
// add :: Number -> Number -> Number
Expand Down Expand Up @@ -58,7 +58,7 @@ const filter = curry((fn, xs) => xs.filter(fn));
const flip = curry((fn, a, b) => fn(b, a));
```

## forEach
## forEach

```js
// forEach :: (a -> ()) -> [a] -> ()
Expand Down Expand Up @@ -107,7 +107,7 @@ const map = curry((fn, f) => f.map(fn));
const match = curry((re, str) => re.test(str));
```

## prop
## prop

```js
// prop :: String -> Object -> a
Expand Down
3 changes: 2 additions & 1 deletion book.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@
],
"structure": {
"summary": "SUMMARY-es.md"
}
},
"language": "es"
}
Loading

0 comments on commit d4679cd

Please sign in to comment.