programação funcional

34
PROGRAMAÇÃO FUNCIONAL 1 @NatanJMai

Upload: natan-mai

Post on 17-Jul-2015

216 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Programação funcional

PROGRAMAÇÃOFUNCIONAL

1

@NatanJMai

Page 2: Programação funcional

HISTÓRIA

2

1930 1950 1970 - 1980

Criação do Cálculo Lambda, por

Alonzo Church. Uma maneira de

expressar computações na

forma de funções.

Criação da linguagem LISP,

baseada no Cálculo Lambda, por John

McCarty. Linguagem muito

utilizada até hoje.

David Turner desenvolve

algumas linguagens,

empregando lazy evaluation.

Page 3: Programação funcional

O QUE É?

Programação Funcional

❏ Paradigma diferente que trata todas as computações em forma de funções. Enfatiza o uso de funções e evita o uso de variáveis e estados.

❏ Experiência em outros paradigmas não facilita tanto a programação funcional.

Outros paradigmas:

● Imperativa● Procedural● Lógica● Orientada a objetos.

3

Page 4: Programação funcional

O QUE É?

Programação Funcional

❏ Diferente do paradigma imperativa, aqui não escrevemos “como fazer algo”, mas sim “o que queremos fazer”

Outros paradigmas:

● Imperativa● Procedural● Lógica● Orientada a objetos.

4

- Funcional: Funções, expressões, recursividade.- Imperativa: Atribuições, variáveis, estados.- O. Objetos: Objetos, classes, métodos.

Page 5: Programação funcional

FUNCIONAL vs IMPERATIVA

❏ Funções são as principais formas de transformar dados;

❏ Ao contrário da imperativa, onde valores podem ser alterados, na funcional os valores são imutáveis (immutable state).

❏ Sem loops (while, for, etc) e sim com recursão. Recursividade é a principal forma de iteração entre algo.

5

Page 6: Programação funcional

FUNCIONAL vs IMPERATIVA

6

Funcional Imperativa

FocoQual informação é desejada e quais transformações são necessárias

Sequência de passos e tarefas para obter as informações.

Estados Não existe. É a base da programação.

Ordem Execução

Baixa importância. É a base da programação.

Fluxos.Chamadas de funções, recursividade.

Loops, if’s.

Page 7: Programação funcional

Sequência:- Avaliação preguiçosa- Funções Anônimas- Compreensão de listas - Funções de primeira classe- Funções de alta ordem- Currying- Estados imutáveis.

CARACTERÍSTICAS

7

Page 8: Programação funcional

AVALIAÇÃO PREGUIÇOSA

8

Page 9: Programação funcional

AVALIAÇÃO PREGUIÇOSA

❏ Uma expressão / função não é valorada caso não seja utilizável durante o programa. Assim, os valores que não serão utilizados, não serão computados.

- Ex.: Imagine passar 3 parâmetros para uma função, mas que conforme a sequência precise utilizar apenas 2 deles. Em funções em linguagens como C, Java, os 3 seriam computados.

9

Page 10: Programação funcional

AVALIAÇÃO PREGUIÇOSA

❏ O principal ganho com lazy evaluation além do desempenho, é a habilidade de criarmos estruturas de dados infinitas.

- Como trabalhar facilmente com uma lista infinita?

10

:|

Page 11: Programação funcional

AVALIAÇÃO PREGUIÇOSA

❏ Exemplo de trabalho com uma lista infinita em Haskell:

> [1..]

> [1, 2, 3, 4, ..]

> take 10 [1..]

> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ..]

> take 5 [2, 4..]

> [2, 4, 6, 8, 10]

11

Page 12: Programação funcional

AVALIAÇÃO PREGUIÇOSA

12

LAZINESS IS NOT ALWAYS

BAD.

Page 13: Programação funcional

FUNÇÕES ANÔNIMAS

13

❏ Funções não necessitam de declaração e especificação. Não precisam nem mesmo de um nome, por isso são conhecidas como anônimas. Já não são exclusividade de linguagens funcionais.

Python:> f = lambda x: x * x

> f (3)

> 9

Haskell: \x -> x * x

> (\x -> x * x) 3

> 9

Page 14: Programação funcional

COMPREENSÃO DE LISTAS

14

❏ É uma forma muito simples de trabalhar com listas de dados, tendo em vista que é baseado na notação de definição de conjunto.

Ex.: ➔ S = { x² | x pertença aos números naturais }➔ Haskell:

> [ x ^ 2 | x <- [0..]]

Page 15: Programação funcional

COMPREENSÃO DE LISTAS

15

❏ Alguns exemplos da utilidade da compreensão de listas em Haskell.

Ex.: Soma dos quadrados dos 10 primeiros números > 2.

> sum [ x ^ 2 | x <- take 10 [3..]]> 645

Page 16: Programação funcional

COMPREENSÃO DE LISTAS

16

Ex .: Quadrado dos 10 primeiros ímpares a partir de 3.

> [x ^ 2 | x <- filter odd (take 10 [3..])]

> [ 3², 5², 7², 9², 11²]

> [ 9, 25, 49, 81, 121 ]

Page 17: Programação funcional

FUNÇÕES DE PRIMEIRA CLASSE

17

❏ Possibilidade de armazenar funções em variáveis.

❏ Passagens de funções como parâmetro, para outras funções.

- De forma geral, as funções de primeira classe são tratadas, criadas e utilizadas em qualquer lugar, assim como valores normais.

Page 18: Programação funcional

FUNÇÕES DE PRIMEIRA CLASSE

18

❏ Passagens de funções como parâmetro, para outras funções.

- Ex .: (Haskell)

> map flisol [2, 4, 6, 8]

> [4, 8, 12, 16]

> :t map> map :: (a -> b) -> [a] -> [b]

> flisol :: Float -> Float

> flisol x = (x / 2) * 4

> :t flisol> flisol :: Float -> Float

Page 19: Programação funcional

FUNÇÕES DE ALTA ORDEM

19

❏ Função que recebe funções como parâmetro.

❏ Função que retorna uma outra função.

> map flisol [2, 4, 6, 8]

> [4, 8, 12, 16]

> :t map> map :: (a -> b) -> [a] -> [b]

Função

- Importante na definição do que de fato “é”.

- Podemos passar qualquer função para map.

Parâmetro

Saída

Page 20: Programação funcional

CURRYING

20

❏ Técnica de transformação de uma função com múltiplos parâmetros em uma cadeia de funções com apenas um parâmetro.

> function f(x, y) {

return x + y;

}

> function g(x, y) {

return function (y){

return x + y;

};

}

- f(x, y) == g(x, y)

Page 21: Programação funcional

CURRYING

❏ Em Haskell, todas as funções são de apenas 1 parâmetro, o que ocorre é a utilização da técnica de Currying.

21

> max 4 5

> 5

> (max 4) 5

> 5

> div :: (Floating a) => a -> a

> div = ( / 10)

> (div) 100

> 10

Com Currying, é criado uma função que recebe 4 e retorna uma função que espera um parâmetro, neste caso, o 5.

Page 22: Programação funcional

ESTADOS IMUTÁVEIS

❏ Não é possível alterar o estado de algo, embora possamos criar um novo estado a partir do mesmo.

❏ Excelente vantagem quando trabalhado em softwares que necessitam de concorrência e paralelismo.

22

> fl = 2

> fli = fl + 1

> fli = 3

CORRETO!.

> fl = 2

> fl = flisol + 1

ERRO!.

Page 23: Programação funcional

CURIOSIDADES (Erlang)

- github.com/erlang/otp- www.erlang.org/- Utilizada amplamente no setor de telecomunicações, além de serviços em banco de dados.

23

- Amazon- Yahoo- Facebook (Chat)- WhatsApp- Ericsson.

Page 24: Programação funcional

CURIOSIDADES (Scala)

- github.com/scala/scala- www.scala-lang.org/- Um ponto forte é a criação de linguagens de domínio específico (DSL), como a Rogue.

24

- Linkedin- Twitter- Foursquare- Sony

Page 25: Programação funcional

- www.haskell.org/- www.haskell.org/community- Finanças, web startups, design de hardware, e até fabricantes de cortadores de grama.

CURIOSIDADES (Haskell)

25

- Facebook- Google- Intel- etc.

Page 26: Programação funcional

- Utilizado como linguagem de extensão do software de CAD AutoCAD, desenvolvido pela AutoDesk. - Lisp foi utilizado para desenvolver o primeiro sistema computacional de matemática simbólica, o Macsyma.

CURIOSIDADES (Lisp)

26

- AutoCAD- Emacs- Orbitz- etc.

LISP

Page 27: Programação funcional

EXEMPLOS

❏ Soma dos números ímpares de 0 a 300.

Haskell

27

> sum (filter odd [0..300])

> 22500

Odd - Ímpar (bool)

Sum - Soma a lista

Filter - Filtro

Page 28: Programação funcional

EXEMPLOS

❏ Números entre 0 e 100 divisíveis por 3.

Haskell

28

> filter p [1..100]

> where p x =

> x `mod` 3 == 0

> [3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99]

Page 29: Programação funcional

EXEMPLOS

❏ Soma dos 5 primeiros números maiores que 0 tal que o seu quadrado seja maior que 1000.

Haskell

29

> sum (take 5 [x | x <- [0..], x ^ 2 > 1000])

> 170

Page 30: Programação funcional

EXEMPLOS

❏ Fatorial

Haskell

30

> fat :: (Num a, Eq a) => a -> a

> fat 0 = 1

> fat x = x * fat (x - 1)

> fat 5

> 120

Page 31: Programação funcional

EXEMPLOS

❏ (x, y, z) tal que (x, y, z) <= 50 e 2x + y - z = 1

3x - y + 2z = 7

x + y + z = 6

31

> [(x, y, z) | x <-[0..50], y <- [0..50], z <-[0..50],

(2 * x + y - z) == 1,

(3 * x - y + 2 * z) == 7,

(x + y + z) == 6]

> [(1, 2, 3)]

Haskell

Page 32: Programação funcional

MAIS?

32

❏ Learn You a Haskell(learnyouahaskell.com)

❏ Functional programming in Scala(Coursera, Martin Odersky) - Desenvolvedor da linguagem.

❏ Diversos projetos no Github.

Page 33: Programação funcional

- Natan J. Mai- Estudante de Ciência da Computação, UFFS.- Estudo por conta própria alguns assuntos do meu interesse. Linguagem de programação acabou se tornando um deles.

SOBRE

33

- [email protected]

- [email protected] @NatanJMai

@NatanJMai

Page 34: Programação funcional

34

“Uma linguagem que não afeta a maneira que você pensa sobre

programação, não vale a pena ser aprendida”

Alan Perlis