Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int...
Transcript of Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int...
![Page 1: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/1.jpg)
Plano de EnsinoInteligência na Web e Big Data
Fabricio Olivetti de França e Thiago Ferreira Covõ[email protected], [email protected]
Centro de Matemática, Computação e CogniçãoUniversidade Federal do ABC
![Page 2: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/2.jpg)
Paradigma Funcional
![Page 3: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/3.jpg)
Paradigmas
Em muitos cursos de Computação e Engenharia iniciam comparadigma imperativo.
Exemplo clássico da receita de bolo.
1
![Page 4: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/4.jpg)
Paradigma Imperativo
1 int pares[10];2 for (int i=0; i<10; i++) {3 pares[i] = 2*i;4 }
2
![Page 5: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/5.jpg)
Paradigma Imperativo
• Descrevo passo a passo o que deve ser feito.• Infame goto.• Evoluiu para o procedural e estruturado com if, while, for.
3
![Page 6: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/6.jpg)
Paradigma Imperativo
1 int pares[10];2
3 for (int i=0; i<10; i++) {4 pares[i] = dobro();5 }6
7 int dobro () {8 static int i = 0;9 ++i;
10 return i;11 }
4
![Page 7: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/7.jpg)
Problemas
Ao seguir o passo a passo, você chega no resultado…mas nãotem ideia de qual será ele.
Qualquer um pode usar suas variáveis globais e suas funções,para o seu uso intencional ou não…
5
![Page 8: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/8.jpg)
Orientação a Objetos
Outro paradigma muito estudado em cursos de Computação.
Encapsula dados com seus próprios métodos.
Evita que certas informações e procedimentos sejam utilizadosfora de seu contexto.
6
![Page 9: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/9.jpg)
Orientação a Objetos
1 class Pares {2 private int i; // não quero ninguém mudando meu
estado↪→
3 private ArrayList lista;4 public Pares() {5 i=0;6 lista = new ArrayList();7 }8 public void addOne() {9 ++i;
10 lista.add(2*i);11 }12 public ArrayList get(){13 return lista;14 }15 }
7
![Page 10: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/10.jpg)
Orientação a Objetos
1 class Main {2 public static void main(String[] args) {3 Pares l1 = new Pares();4 l1.addOne();5 l1.addOne();6 l1.addOne();7 System.out.println(l1.get());8 }9 }
esse código foi escrito propositalmente da pior forma
8
![Page 11: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/11.jpg)
Problemas
Nos textos didáticos temos exemplos simples e criados parailustrar quando faz sentido termos objetos.
Nem sempre isso representa a realidade.
Composição de funções através de herança = pode virarbagunça se alguns cuidados não forem tomados.
9
![Page 12: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/12.jpg)
Problemas
Encapsula códigos imperativos para segurança e reuso, masnão evita os bugs na criação das classes.
Usa estado intensivamente, incentiva mutabilidade enão-determinismo.
Difícil de paralelizar.
10
![Page 13: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/13.jpg)
Efeito colateral
A execução da instrução atual depende do estado atual dosistema.
Ex.: dobro() e addOne() vai depender do estado atual de i.
11
![Page 14: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/14.jpg)
Efeito colateral
Eu posso executar a função dobro() para o primeiro e osegundo elemento em paralelo??
12
![Page 15: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/15.jpg)
Paradigma Funcional
• Funções são atores principais.• Computação = avaliação de composição de funções.• Evita estados.• Declarativo.
13
![Page 16: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/16.jpg)
Paradigma Funcional
1 take 10 [2*i | i <- zplus]2
3 -- pegue 10 elementos da lista formada pelo4 -- dobro dos números inteiros positivos.
14
![Page 17: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/17.jpg)
Paradigma Funcional
Note que i não é uma variável, não muda de valor, é apenasum símbolo da definição.
15
![Page 18: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/18.jpg)
Funções Puras
Linguagens funcionais incentivam (ou obrigam) a criação defunções puras.
Ao chamar a função com o mesmo argumento, sempre terá amesma resposta.
Se não temos efeito colateral…
• …e o resultado de uma expressão pura não for utilizado,não precisa ser computado.
• …o programa como um todo pode ser reorganizado eotimizado.
• …é possível computar expressões em qualquer ordem (ouem paralelo).
16
![Page 19: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/19.jpg)
Funções Puras
1 double media (int * valores, int n) {2 double soma = 0;3 int i;4 for (i = 0; i < n; i++)5 soma_valor(&soma, valores[i]);6 return soma / n;7 }8
9 void soma_valor (double * soma, int valor) {10 soma += valor;11 }
17
![Page 20: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/20.jpg)
Programação sem bugs
A ausência de estados permite evitar muitos erros deimplementação.
O lema da linguagem Haskell: ”se compilou, o código estácorreto!”
18
![Page 21: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/21.jpg)
Funções e Funções
A construção de um programa nesse paradigma é através dacomposição de programas menores. O código anterior setraduz em:
1 (take 10 . map (2*)) zplus
19
![Page 22: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/22.jpg)
Iterações vs Recursões
Em linguagens funcionais os laços iterativos sãoimplementados via recursão, geralmente levando a um códigoenxuto e declarativo.
20
![Page 23: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/23.jpg)
Iterações vs Recursões
1 int gcd (int m, int n) {2 int r = m % n;3 while(r != 0) {4 m = n; n = r; r = m%n;5 }6 return m;7 }
21
![Page 24: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/24.jpg)
Iterações vs Recursões
1 mdc 0 b = b2 mdc a 0 = a3 mdc a b = mdc b (a `rem` b)
22
![Page 25: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/25.jpg)
Funções como atores principais
![Page 26: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/26.jpg)
Composição e Abstração
Dois conceitos importantes do paradigma funcional são acomposição e a abstração.
23
![Page 27: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/27.jpg)
Composição e Abstração
<blockquote class=”twitter-tweet”data-lang=”pt»<plang=”en”dir=”ltr»'The purpose of abstraction is not to bevague, but to create a new semantic level in which one can beabsolutely precise' - Edsger Dijkstra <ahref=”https://t.co/S6UruJbBjF»pic.twitter.com/S6UruJbBjF</a></p>—Computer Science (@CompSciFact) <ahref=”https://twitter.com/CompSciFact/status/948965367107465218?ref_src=twsrc%5Etfw»4 dejaneiro de 2018</a></blockquote> <script async src=”https://platform.twitter.com/widgets.js”charset=”utf-8»</script>
24
![Page 28: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/28.jpg)
Exemplo
1 char * inverte_str(char * orig) {2 int len = 0;3 char *ptr = orig, *dest, *pilha;4 int i, topo = -1;5
6 while (*ptr != '\0') ++ptr;7 len = ptr - orig;8
9 dest = malloc(sizeof(char)*(len+1));10 pilha = malloc(sizeof(char)*len);11
12 for (i=0; i<len; ++i) {13 pilha[++topo] = orig[i];14 }15
16 i = 0;17 while (topo != -1) dest[i++] = pilha[topo--];18
19 dest[len] = '\0';20 free(pilha);21 return dest;
25
![Page 29: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/29.jpg)
Exemplo
1 char * inverte_str(char * orig) {2 int len = strlen(orig);3 pilha * p = cria_pilha();4 char * dest;5
6 dest = cria_str(len);7
8 while (*orig != '\0') {9 empilha(p, *orig);
10 ++orig;11 }12
13 while (!vazia(p)) {14 *dest = desempilha(p);15 ++dest;16 }17
18 return dest;19 }
26
![Page 30: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/30.jpg)
Exemplo
1 char * inverte_str(char * orig) {2 pilha * p = cria_pilha();3 return desempilha_str(empilha_str(p, *orig));4 }
27
![Page 31: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/31.jpg)
Pergunta
Quais vantagens vocês percebem nessa última versão?
28
![Page 32: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/32.jpg)
Vantagens
• Construir o conceito de pilha uma única vez, utilizar emdiversos contextos.
• Testar a corretude de cada módulo independentemente.• Código declarativo• Número menor de variáveis por módulo
29
![Page 33: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/33.jpg)
Composição de funções
A composição de funções permite minimizar o uso de variáveisauxiliares, tornar o código declarativo e pensar melhor no fluxode processamento.
30
![Page 34: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/34.jpg)
Composição de funções
Estamos acostumados a pensar nesse fluxo de processamentono bash do Linux:
1 cat texto | grep "Big Data" | more
31
![Page 35: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/35.jpg)
Construindo Pipelines
A construção do fluxo de processamento em programação éfeita seguindo os tipos de entrada e saída das funçõesconstruídas.
32
![Page 36: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/36.jpg)
Construindo Pipelines
Matematicamente podemos pensar em funções do tipof : X → Y que recebem um único argumento do tipo X eretornam um valor do tipo Y .
33
![Page 37: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/37.jpg)
Construindo Pipelines
Exemplos:
1 int dobra( int );2 string toStr(int);3 bool isEven(int);4 bool isOnlyAlpha(string);
34
![Page 38: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/38.jpg)
Extraindo informação da assinatura
A assinatura de uma função permite tirar algumas informaçõesdela. Por exemplo, toda função que retorna um booleanorepresenta um predicado, uma consulta.
35
![Page 39: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/39.jpg)
Construindo Pipelines
Para que duas funções sejam compostas o tipo de saída deuma função deve ser o mesmo da entrada da outra.
36
![Page 40: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/40.jpg)
Pergunta
Seguindo as funções anteriores, quais composições vocêconsegue montar?
1 int dobra( int );2 string toStr(int);3 bool isEven(int);4 bool isOnlyAlpha(string);
37
![Page 41: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/41.jpg)
Funções de múltiplos argumentos
Para todos os efeitos, funções de múltiplos argumentos sãoequivalentes a funções de um único argumento cujo tipo é umatupla de valores:
1 int soma(int, int) = int soma( pair<int, int> );
38
![Page 42: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/42.jpg)
Listas e Functores
![Page 43: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/43.jpg)
Listas
Um tipo importante em programação funcional é a lista.
A lista é um container de elementos de certo tipo que podemser transformados, condensados e filtrados.
39
![Page 44: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/44.jpg)
Listas
A operação mais importante em uma lista é a transformação,geralmente feita através de uma função chamada ‘map‘:
1 # map : ((A -> B), List[A]) -> List[B]2 def map(f, xs):3 return (f(x) for x in xs)
40
![Page 45: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/45.jpg)
Listas
Reparem que essa função recebe uma função do tipo A para otipo B e uma lista de A como parâmetro retornando uma listado tipo B.
Isso é chamado de função de alta ordem.
41
![Page 46: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/46.jpg)
Listas
Uma outra interpretação que pode ser dada para a função mapé de que ela recebe uma função de A para B e retorna outrafunção de L[A] para L[B]. Isso é denominado de Functor:
1 def fmap(f):2 def g(xs):3 return (f(x) for x in xs)4 return g5
6 fmap(dobra)(xs) == map(dobra, xs)
42
![Page 47: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/47.jpg)
Functor
Um Functor generaliza a função map para qualquer tipo decontainer! Exemplo:
1 def fmap(f):2 def g(dic):3 return {k:f(v) for k, v in dic.iter()}4 return g
43
![Page 48: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/48.jpg)
Leis do Functor
1. Dada uma função identidade id: fmap(id) == id2. Dadas duas funções f, g: fmap comp(f,g) ==
comp(fmap(f), fmap(g))
sendo comp a composição de funções.
44
![Page 49: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/49.jpg)
Leis do Functor
Note que a segunda lei nos permite otimizar operações feitasem nossos dados:
1 map(dobra, map(somaUm, xs)) == map(comp(somaUm, dobra),xs)↪→
Na segunda forma percorremos a lista uma única vez.
45
![Page 50: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/50.jpg)
Exercício
Dado o tipo descrito abaixo, como você escreveria a funçãofmap?
1 class Identity:2 def __init__(self, x):3 self.val = x4
5 def fmap(f):6 def g(i):7 return ???8 return g
46
![Page 51: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/51.jpg)
Exercício
Dado o tipo descrito abaixo, como você escreveria a funçãofmap?
1 class Tree:2 def __init__(self, x):3 self.root = x4 self.left = None5 self.right = None6
7 def insert(self, x):8 if x < self.root:9 self.left = Tree(x) if self.left is None
10 else self.left.insert(x)11 elif x > self.root:12 self.right = Tree(x) if self.right is None13 else self.right.insert(x)
47
![Page 52: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/52.jpg)
Avaliação Preguiçosa
![Page 53: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/53.jpg)
Avaliação Preguiçosa
Algumas linguagens funcionais implementam o conceito deavaliação preguiçosa.
Quando uma expressão é gerada, ela gera uma promessa deexecução.
Se e quando necessário, ela é avaliada.
48
![Page 54: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/54.jpg)
Avaliação Preguiçosa
1 int main () {2 int x = 2;3 f(x*x, 4*x + 3);4 return 0;5 }6
7 int f(int x, int y) {8 return 2*x;9 }
49
![Page 55: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/55.jpg)
Avaliação Preguiçosa
1 int main () {2 int x = 2;3 f(2*2, 4*2 + 3);4 return 0;5 }6
7 int f(int x, int y) {8 return 2*x;9 }
50
![Page 56: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/56.jpg)
Avaliação Preguiçosa
1 int main () {2 int x = 2;3 f(4, 4*x + 3);4 return 0;5 }6
7 int f(int x, int y) {8 return 2*x;9 }
51
![Page 57: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/57.jpg)
Avaliação Preguiçosa
1 int main () {2 int x = 2;3 f(4, 11);4 return 0;5 }6
7 int f(int x, int y) {8 return 2*x;9 }
52
![Page 58: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/58.jpg)
Avaliação Preguiçosa
1 int main () {2 int x = 2;3 8;4 return 0;5 }6
7 int f(int x, int y) {8 return 2*x;9 }
53
![Page 59: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/59.jpg)
Avaliação Preguiçosa
1 f x y = 2*x2
3 main = do4 let z = 25 print (f (z*z) (4*z + 3))
54
![Page 60: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/60.jpg)
Avaliação Preguiçosa
1 f x y = 2*x2
3 main = do4 let z = 25 print (2 * (z*z))
55
![Page 61: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/61.jpg)
Avaliação Preguiçosa
1 f x y = 2*x2
3 main = do4 let z = 25 print (8)
A expressão 4 ∗ z + 3 nunca foi avaliada!
56
![Page 62: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/62.jpg)
Avaliação Preguiçosa
Isso permite a criação de listas infinitas:
1 [2*i | i <-[1..]]
57
![Page 63: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/63.jpg)
Avaliação Preguiçosa
No Python podemos fazer algo similar utilizando yield:
1 def gerador(x):2 while x != 0:3 yield x%24 x = x/2
A sequência dos valores sucessivos de x serão gerados sobdemanda.
58
![Page 64: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/64.jpg)
Comentários Finais
![Page 65: Plano de Ensino - Inteligência na Web e Big DataOrientaçãoaObjetos 1 class Pares { 2 private int i; // não quero ninguém mudando meu,! estado 3 private ArrayList lista; 4 public](https://reader033.fdocumentos.tips/reader033/viewer/2022060502/5f1c21bcc373fa1ac138a065/html5/thumbnails/65.jpg)
Funcional e Big Data
Os conceitos do paradigma funcional são importantes quandotrabalhamos com Big Data:
• A pureza das funções permite concorrência de operações• A imutabilidade dos dados evita a necessidade de lidarcom alterações custosas
• Da mesma forma, garante consistência nos resultados• A ideia de Functors garante paralelismo e a capacidade deotimização do pipeline de processamento
• A avaliação preguiçosa permite evitar processamentosdesnecessários
59