Sei sulla pagina 1di 197

˜

PROGRAMAC¸ AO FUNCIONAL

USANDO HASKELL

Programa¸ao Funcional Usando Haskell

Francisco Vieira de Souza

Licenciado em Matem´atica (1978) e Engenheiro Civil (1982) pela Universidade Federal do Piau´ı, Mestre (1994) e Doutor (2000) em Ciˆencia da Computa¸c˜ao pela Universidade Federal de Pernambuco.

Professor do Departamento de Matem´atica (1986-1988), fundador (1987) e professor (desde 1987) do Departamento de Inform´atica e Estat´ıstica da Universidade Federal do Piau´ı.

UFPI/CCN/DIE Teresina-Pi Janeiro de 2007

Copyright c 2007,

Departamento de Inform´atica e Estat´ıstica, Centro de Ciˆencias da Natureza, Universidade Federal do Piau´ı. Todos os direitos reservados.

A reprodu¸c˜ao do todo ou parte deste trabalho somente ser´a permitida para fins educacionais e de pesquisa e com a expressa autoriza¸c˜ao do autor.

Copyright c 2007,

Departamento de Inform´atica e Estat´ıstica, Centro de Ciˆencias da Natureza, Universidade Federal do Piau´ı. All rights reserved.

Reproduction of all or part of this work only will be permitted for educational or research use and with expressed permission of the author.

iii

Apresenta¸c˜ao

Esta Apostila representa a compila¸c˜ao de v´arios t´opicos, desenvolvidos por pesquisadores de renome, no campo da programa¸c˜ao funcional. Ela tem como objetivo servir de guia aos profis- sionais de Inform´atica que desejam ter um conhecimento inicial sobre o paradigma funcional de forma geral e, em particular, sobre programa¸c˜ao usando Haskell. Ultimamente, Haskell tem se tornado a linguagem funcional padr˜ao do discurso, j´a existindo v´arios interpretadores e compi- ladores para ela, al´em de v´arias ferramentas de an´alise de programas nela codificados (profiles).

Para atingir este objetivo, acreditamos que o estudo deva ser acompanhado de algum co- nhecimento, mesmo que m´ınimo, sobre a fundamenta¸c˜ao destas linguagens e da forma como elas s˜ao implementadas. Este conhecimento proporciona ao leitor uma vis˜ao das principais ca- racter´ısticas e propriedades destas linguagens. Em particular, ´e importante entender porque as t´ecnicas utilizadas na compila¸c˜ao das linguagens imperativas n˜ao se mostraram adequadas na compila¸c˜ao de linguagens funcionais.

Em 1978, John Backus advogou o paradigma funcional como o que oferecia a melhor solu¸c˜ao para a chamada “crise do software”. As linguagens funcionais s˜ao apenas uma sintaxe mais cˆomoda para o λ-c´alculo. David Turner [42] mostrou, em 1979, que a l´ogica combinatorial poderia ser extendida de forma a possibilitar a implementa¸ao eficiente de linguagens funcionais. Esse trabalho provocou uma corrida em dire¸c˜ao `a pesquisa nesta ´area, gerando uma variedade de t´ecnicas de implementa¸c˜ao destas linguagens.

Dentre estas t´ecnicas, uma que tem sido adotada, com resultados promissores, ´e a utiliza¸c˜ao do λ -c´alculo como linguagem intermedi´aria entre a linguagem de alto n´ıvel e a linguagem de m´aquina. Os programas codificados em alguma linguagem funcional de alto n´ıvel s˜ao traduzidos para programas em λ-c´alculo e estes s˜ao traduzidos para programas em linguagem de m´aquina. Neste caso, o λ-c´alculo desempenha um papel semelhante ao que a linguagem Assembly exerce, como linguagem de montagem, na compila¸c˜ao de linguagens imperativas. Esta metodologia tem dado certo, uma vez que j´a se conhecem t´ecnicas eficientes de tradu¸c˜ao de programas em λ-c´alculo para programas execut´aveis, faltando apenas uma tradu¸c˜ao eficiente de programas codificados em uma linguagem funcional de alto n´ıvel para programas em λ -c´alculo.

Esta Apostila tem in´ıcio em seu primeiro Cap´ıtulo tratando das caracter´ısticas das lingua- gens funcionais, destacando suas vantagens em rela¸c˜ao `as linguagens de outros paradigmas que utilizam atribui¸c˜oes destrutivas. Em seguida, ´e feita uma introdu¸c˜ao ao λ-c´alculo. Apesar do car´ater introdut´orio, achamos ser suficiente para quem quer dar os primeiros passos em dire¸c˜ao `a aprendizagem desta t´ecnica. Os Cap´ıtulos subseq¨uentes se referem todos a` Programa¸c˜ao Fun- cional usando Haskell.

Por ser uma primeira tentativa, a Apostila cont´em erros e sua apresenta¸c˜ao did´atico-peda- g´ogica deve ser revista. Neste sentido, agradecemos cr´ıticas construtivas que ser˜ao objeto de an´alise e reflex˜ao e, por isto mesmo, muito bem-vindas.

Teresina-Pi, janeiro de 2007.

Francisco Vieira de Souza

iv

Conte´udo

Introdu¸c˜ao

 

viii

1 Programa¸ao Funcional

11

1.1

Introdu¸c˜ao

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

11

1.2

Hist´orico

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

12

1.3 Programa¸c˜ao com express˜oes

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

13

1.4 Fun¸c˜oes e express˜oes aplicativas

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

14

1.5 Independˆencia da ordem de avalia¸c˜ao

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

15

1.6 Transparˆencia referencial

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

17

1.7 Interfaces manifestas

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

19

1.8 Defini¸c˜ao de fun¸c˜oes

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

20

20

 

1.8.1 Defini¸c˜oes de fun¸c˜oes por enumera¸c˜ao 1.8.2 Defini¸c˜ao de fun¸c˜oes por composi¸c˜ao

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

21

1.8.3 Defini¸c˜ao de fun¸c˜oes por recurs˜ao

 

.

.

.

.

21

1.8.4 Defini¸c˜ao expl´ıcita e impl´ıcitas de vari´aveis

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

24

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

25

1.9

1.8.5 Defini¸c˜oes expl´ıcitas e impl´ıcitas de fun¸c˜oes .

Resumo

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

2 λ -c´alculo

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

26

29

2.1 Introdu¸c˜ao

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

29

2.2 λ-express˜oes .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

30

2.3 A sintaxe do λ-c´alculo

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

31

 

2.3.1

Aplica¸c˜ao de fun¸c˜ao e currifica¸c˜ao

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

31

2.4 Fun¸c˜oes e constantes pr´e-definidas

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

32

2.5 λ-abstra¸c˜oes .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

32

2.6 A semˆantica operacional do λ-c´alculo

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

33

 

2.6.1

Formaliza¸c˜ao das ocorrˆencias livres ou ligadas

 

35

2.7 Combinadores

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

35

2.8 Regras de convers˜oes entre λ-express˜oes

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

37

 

2.8.1 α-convers˜ao

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

37

2.8.2 η-convers˜ao

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

37

 

v

2.8.3 β-convers˜ao

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

38

2.8.4 Nomea¸c˜ao .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

39

2.8.5

Captura

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

39

2.9 Convers˜ao, redu¸c˜ao e abstra¸c˜ao

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

40

2.10 Provando a conversibilidade

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

41

2.11 Uma nova nota¸c˜ao

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

41

2.12 Ordem de redu¸c˜ao

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

43

2.13 Fun¸c˜oes recursivas

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

45

2.14 Algumas defini¸c˜oes

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

47

2.15 Resumo

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

48

3 Programa¸ao funcional em Haskell

 

49

3.1 Introdu¸c˜ao

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

49

3.1.1

Outras implementa¸c˜oes

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

50

3.2 Primeiros passos

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

51

3.2.1 O interpretador Hugs

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

53

3.2.2 Identificadores em Haskell

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

54

3.3 Fun¸c˜oes em Haskell

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

55

3.3.1 Construindo fun¸c˜oes

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

56

3.3.2 Avalia¸c˜ao de fun¸c˜oes em Haskell

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

57

3.3.3 Casamento de padr˜oes (patterns matching)

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

58

3.4 Tipos de dados em Haskell

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

59

3.4.1 Os tipos primitivos da linguagem .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

59

3.4.2 Metodologias de programa¸c˜ao

 

.

.

.

.

.

.

.

.

.

.

.

65

3.4.3 Os tipos de dados estruturados de Haskell

 

68

3.4.4 Escopo .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

69

3.4.5 Express˜oes condicionais

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

70

3.4.6 C´alculos:

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

71

3.5 Projeto de programas

3.5.1

. Provas de programas

.

.

3.6 Resumo

.

.

.

.

.

.

.

.

.

.

4 O tipo Lista

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

73

74

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

77

79

4.1 Fun¸c˜oes sobre listas

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

80

4.2 Pattern matching revisado

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

84

4.3 Compreens˜oes e express˜oes ZF (Zermelo-Fraenkel)

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

87

4.4 Fun¸c˜oes de alta ordem

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

93

4.4.1 A fun¸c˜ao map

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

94

4.4.2 Fun¸c˜oes anˆonimas

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

97

 

vi

4.5 Polimorfismo

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

100

 

4.5.1 Tipos vari´aveis

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

100

4.5.2 O tipo mais geral

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

101

4.6 Indu¸c˜ao estrutural

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

102

4.7 Composi¸c˜ao de fun¸c˜oes

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.