Skip to content

Commit ae8a44f

Browse files
committed
Merge pull request #10 from oieduardorabelo/master
translating to pt-BR
2 parents 98ab726 + 34a51f1 commit ae8a44f

File tree

2 files changed

+266
-0
lines changed

2 files changed

+266
-0
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
## JavaScript Functional Programming Cookbook (ES6)
22
A Cookbook for writing FP in JavaScript using ES6
33

4+
**Translations**
5+
6+
- [Português (Brasil)](/translations/pt-BR/README.md)
7+
48
### Summary
59

610
* [Pure functions](#pure-functions)

translations/pt-BR/README.md

Lines changed: 262 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,262 @@
1+
## Livro de receitas - Programação Funcional em JavaScript (ES6)
2+
Um livro de receitas para escrever _programação funcional_ no JavaScript com ES6.
3+
4+
### Índice
5+
6+
* [Funções puras](#funções-puras)
7+
* [O que são "Higher-order functions"](#o-que-são-higher-order-functions)
8+
* [Recursão](#recursão)
9+
* [O que são "Functors"](#o-que-são-functors)
10+
* [Compondo funções](#compondo-funções)
11+
* [Usando desestruturação de parâmetros](#usando-desestruturação-de-parâmetros)
12+
* [O que é "Currying"](#o-que-é-currying)
13+
14+
### Funções puras
15+
Retorna o mesmo valor se passado os mesmos parâmetros. Sua execução não depende do estado do sistema.
16+
17+
1) Função impura
18+
19+
```javascript
20+
let number = 1;
21+
22+
const increment = () => number += 1;
23+
24+
increment();
25+
// 2
26+
```
27+
28+
2) Função pura
29+
30+
```javascript
31+
const increment = n => n + 1;
32+
33+
increment(1);
34+
// 2
35+
```
36+
37+
### O que são "Higher-order functions"
38+
São funções que operam em outras funções, seja por receber elas como argumentos ou retornando-a como valor.
39+
40+
1) Função de soma
41+
42+
```javascript
43+
const sum = (x, y) => x + y;
44+
45+
const calculate = (fn, x, y) => fn(x, y);
46+
47+
calculate(sum, 1, 2);
48+
// 3
49+
```
50+
51+
2) Filtrando elementos
52+
53+
```javascript
54+
let students = [
55+
{name: 'Anna', grade: 6},
56+
{name: 'John', grade: 4},
57+
{name: 'Maria', grade: 9}
58+
];
59+
60+
const isApproved = student => student.grade >= 6;
61+
62+
students.filter(isApproved);
63+
// [ { name: 'Anna', grade: 6 }, { name: 'Maria', grade: 9 } ]
64+
```
65+
66+
3) Map
67+
68+
```javascript
69+
const byName = obj => obj.name;
70+
71+
students.map(byName);
72+
// [ 'Anna', 'John', 'Maria' ]
73+
```
74+
75+
4) Encadeando funções
76+
77+
```javascript
78+
let students = [
79+
{name: 'Anna', grade: 6},
80+
{name: 'John', grade: 4},
81+
{name: 'Maria', grade: 9}
82+
];
83+
84+
const isApproved = student => student.grade >= 6;
85+
86+
const byName = obj => obj.name;
87+
88+
students.filter(isApproved).map(byName);
89+
// ['Anna', 'Maria']
90+
```
91+
92+
5) Usando _reduce_
93+
94+
```javascript
95+
const totalGrades = students.reduce((sum, student) => sum + student.grade, 0);
96+
97+
totalGrades
98+
// 19
99+
```
100+
101+
### Recursão
102+
Sempre que uma função chama a si mesmo, criando um loop.
103+
104+
1) Função de contagem regressiva
105+
106+
```javascript
107+
const countdown = num => {
108+
if (num > 0) {
109+
console.log(num);
110+
countdown(num - 1);
111+
}
112+
}
113+
114+
countdown(5);
115+
/*
116+
5
117+
4
118+
3
119+
2
120+
1
121+
*/
122+
```
123+
124+
2) Calculando uma fatorial
125+
126+
```javascript
127+
const factorial = num => {
128+
if (num <= 0) {
129+
return 1;
130+
} else {
131+
return (num * factorial(num - 1));
132+
}
133+
}
134+
135+
factorial(5);
136+
//120
137+
```
138+
139+
### O que são "Functors"
140+
É um objeto que implementa o método _map_. O método _map_ do _functor_ retorna seu próprio conteúdo e, para cada um deles, processa a transformação passada como _callback_ para o método _map_ e retorna um novo _functor_, que contém a estrutura do primeiro _functor_, porém, com seu conteúdo transformado.
141+
142+
1) Adicionando um valor a todos os elementos em um array
143+
144+
```javascript
145+
const plus1 = num => num + 1;
146+
147+
let numbers = [1, 2, 3];
148+
numbers.map(plus1);
149+
// [2, 3, 4]
150+
```
151+
152+
### Compondo funções
153+
A composição de duas ou mais funções retornando uma nova função.
154+
155+
1) Combinando duas funções para gerar uma nova
156+
157+
```javascript
158+
const compose = (f,g) => x => f(g(x));
159+
160+
const toUpperCase = function(x) { return x.toUpperCase(); };
161+
const exclaim = function(x) { return x + '!'; };
162+
163+
const angry = compose(exclaim, toUpperCase);
164+
165+
angry("stop this");
166+
// STOP THIS!
167+
```
168+
169+
2) Combinando três funções para gerar uma nova
170+
171+
```javascript
172+
const compose = (f,g) => x => f(g(x));
173+
174+
const toUpperCase = function(x) { return x.toUpperCase(); };
175+
const exclaim = function(x) { return x + '!'; };
176+
const moreExclaim = function(x) { return x + '!!!!!'; };
177+
178+
const reallyAngry = compose(exclaim, compose(toUpperCase, moreExclaim));
179+
180+
reallyAngry("stop this");
181+
// STOP THIS!!!!!!
182+
```
183+
184+
### Usando desestruturação de parâmetros
185+
Extrair dados de arrays ou objetos usando uma sintaxe que espelha a estrutura literal do array ou objeto. Conhecida também como _"Pattern Matching"_ (em português, algo como, **correspondendo ao mesmo padrão**).
186+
187+
1) Selecionando a partir de um padrão
188+
189+
```javascript
190+
const foo = () => [1, 2, 3];
191+
192+
const [a, b] = foo();
193+
console.log(a, b);
194+
// 1 2
195+
```
196+
197+
2) Acumula os valores de restantes
198+
199+
```javascript
200+
const [a, ...b] = [1, 2, 3];
201+
console.log(a, b);
202+
// 1 [2, 3]
203+
```
204+
205+
3) Parâmetros opcionais
206+
207+
```javascript
208+
const ajax = function ({ url = "localhost", port: p = 80}, ...data) {
209+
console.log("Url:", url, "Port:", p, "Rest:", data);
210+
};
211+
212+
ajax({ url: "someHost" }, "additional", "data", "hello");
213+
// Url: someHost Port: 80 Rest: [ 'additional', 'data', 'hello' ]
214+
215+
ajax({ }, "additional", "data", "hello");
216+
// Url: localhost Port: 80 Rest: [ 'additional', 'data', 'hello' ]
217+
```
218+
219+
### O que é "Currying"
220+
Recebe uma função que recebe múltiplos argumentos e transforma isso em um encadeamento de funções, passando um argumento de cada vez e retornando a próxima função, até que a última retorne o resultado.
221+
222+
1) Utilizando _currying_ em um objeto
223+
224+
```javascript
225+
const student = name => grade => `Name: ${name} | Grade: ${grade}`;
226+
227+
student("Matt")(8);
228+
// Name: Matt | Grade: 8
229+
```
230+
231+
2) Utilizando _currying_ em uma função de soma
232+
233+
```javascript
234+
const add = x => y => x + y;
235+
236+
const increment = add(1);
237+
const addFive = add(5);
238+
239+
increment(3);
240+
//4
241+
242+
addFive(10);
243+
// 15
244+
```
245+
246+
### Artigos relacionados
247+
248+
**OBS:** Todos em inglês.
249+
250+
[https://gist.github.com/mikaelbr/9900818](https://gist.github.com/mikaelbr/9900818)
251+
252+
[https://www.gitbook.com/book/jcouyang/functional-javascript/details](https://www.gitbook.com/book/jcouyang/functional-javascript/details)
253+
254+
[https://www.youtube.com/playlist?list=PL0zVEGEvSaeEd9hlmCXrk5yUyqUag-n84](https://www.youtube.com/playlist?list=PL0zVEGEvSaeEd9hlmCXrk5yUyqUag-n84)
255+
256+
[http://functionaljavascript.blogspot.com.br/2013/07/functors.html](http://functionaljavascript.blogspot.com.br/2013/07/functors.html)
257+
258+
[http://nicoespeon.com/en/2015/01/pure-functions-javascript/](http://nicoespeon.com/en/2015/01/pure-functions-javascript/)
259+
260+
[https://drboolean.gitbooks.io/mostly-adequate-guide/](https://drboolean.gitbooks.io/mostly-adequate-guide/)
261+
262+
[https://www.youtube.com/watch?v=DisD9ftUyCk](https://www.youtube.com/watch?v=DisD9ftUyCk)

0 commit comments

Comments
 (0)