Apresentação
O paradigma de funcional é um dos muitos paradigmas de programação disponíveis e, uma vez que você tenha sido "contaminado" pelos outros, certamente não é o mais simples de se entender. Ainda assim, é um paradigma que deve ser estudado pois seus pontos fortes tem sido incorporados cada vez mais frequentemente em frameworks e linguagens não necessariamente reconhecidos como funcionais. Por isso, neste curso estudaremos o paradigma funcional de uma forma prática, tentando sempre que possível mostrar diversas aplicações das ideias apresentadas no mundo da programação moderna.
Agradecimentos
Antes de começarmos nosso estudo, deixo aqui o meu agradecimento aos professores da Faculdade de Computação da UFU que forneceram o material sobre o qual a primeira versão destas notas de aula foram baseadas: Profa. Gina Maira B. Oliveira, Profa. Maria Adriana Vidigal de Lima, e Prof. Henrique Fernandes.
Convenções
Neste documento, usamos diversos recursos visuais com diferentes propósitos.
- itálico indica termos em outras línguas, como framework ou middleware. Alguns termos, contudo, são tão corriqueiramente usados que me escapam quando escrevendo e acabam não grafados corretamente.
- negrito indica a introdução de termos e conceitos importantes, como mônada e função de ordem superior.
- Apontadores indicam um sítio relacionado ao termo, por exemplo, como criar um repositório no Github. A leitura dos conteúdos apontados é sugerida ao final da aula.
- Notas de rodapé1 indicam referenciais teóricos importantes, com detalhes da publicação e apontadores para onde a publicação pode ser lida. Elas serão, em algum momento, substituídas por referências formais.
- Imagens não autorais são também apontadores para a fonte e tem como texto alternativo as informações da autoria.
- Caixas alinhadas à esquerda são usadas para várias finalidades. Por exemplo, para apresentar exercícios, destacar especificações, apontar tarefas a serem executas por mim. Os diversos usos são indicados nos ícones e cores das caixas.
Exercício
Isso é um exercício!
Resposta
Esta é a resposta do exercício.
Aviso!
Este material está em constante evolução.
Resumo
- Elementos visuais
- Caixas alinhadas à direita podem ser vistas como um sumário executivo do que está sendo apresentado no texto adjacente.
Exemplos de código são colocados tanto diretamente dentro de linhas, como em somar x y = x + y
quando em blocos separados, se mais longos.
somar :: Int -> Int -> Int
somar x y = x + y
Exemplos de invocações de funções são apresentados também como blocos, em que entradas são precedidas por >
mas não as saídas.
> somar 3 4
7
> 3 + 4
7
O resultado da computação de uma função é apontado por ⭆
, por exemplo, 1+1 ⭆ 2
.
Referências
Esta é uma lista não exaustiva de referencial teórico. Esta lista será aumentada com o ponteiro de entrada para o material. Referências a tópicos específicos são apresentadas nas seções onde são usadas, como notas de rodapé.
- Haskell - Divide o estudo da linguagem em "trilhas" de diversos níveis.
- Learn you a Haskell for a greater good - Visão geral e de alto nível da linguagem.
- Learn Haskell Programming - Tutorial para iniciantes.
- Haskell in Depth
- Hoogle - Haskell search engine.
TODO
Esta sessão documenta o conteúdo presente e a ser adicionado nestas notas de aula, sendo principalmente para a minha própria referência. A ordem não reflete a ordem de apresentação.
-
Organização
- Ativar plugin bibtex e organizar referências.
- Reorganizar e agrupar tópicos.
-
Tipos
-
Tipagem em Haskell
- Forte - sem conversão automática
- Estática - em tempo de compilação.
- Inferência - dedução de tipos não especificados
-
:t
aplicado a variáveis
-
Tipos simples
- Números
- Strings
-
Tipos compostos
- Tuplas - Heterogêneos
- Listas - Homogêneos
- range operator [1..10]
- : cons
- ++ append
- !! get at index
- Pattern matching
- Compreensão de listas (Zermello-Frankel)
- Listas infinitas
- ordenação
- selection-sort
- quick-sort
- Merge-sort
-
Type classes
- Classes comuns
- Eq
- Ord
- Enum
- Show
- Read
- Bounded
- deriving
- instance
- Novas type classes - http://learnyouahaskell.com/making-our-own-types-and-typeclasses#algebraic-data-types
- Classes comuns
-
Tipos especificados pelo usuário
- Definição -
type
- apelidos para tipos- não parametrizado
- parametrizado - Variáveis de tipo
- Tipos algébricos
- Definição -
data
- https://mmhaskell.com/blog/2017/12/24/haskell-data-types-in-5-steps
- https://en.wikibooks.org/wiki/Haskell/GADT#Extending_the_language
- produto x soma
- não parametrizado
- parametrizado - Variáveis de tipo
- Record
- Casamento de padrões
- as pattern -
@
- as pattern -
- Tipos recursivos
- Listas
- Árvores
- Definição -
- Definição -
- Tipos abstratos de dados
- Fila
- Mapa
- Pilha
-
-
Funções
- Equações simples
- Guardas
- Casamento de padrões
- where
- let in
- operadores
- Protótipos
- Inferência -
:t
- Especificação manual
- Inferência -
- Polimorfismo
- type variables
- http://www.decom.ufop.br/romildo/2014-1/bcc222/practices/p06-polimorfismo.pdf
head :: [a] -> a
swap :: (a,b) -> (b,a)
- type variables
- Recursão
- simples
- em listas
- de cauda
- Ordem superior
- fold
- filter
- map
- .
- $
- Currying
-
Controle de fluxo
- if-then-else
- case-of
-
Avaliação preguiçosa
- mostrar com listas infinitas
- a função cycle
- Where - let in
- mostrar com listas infinitas
-
Entrada e saída:
- Show
- Read
- Monads (menção)
- IO
- GUI (e.g., GLOSS)
-
Mônadas
- https://www.youtube.com/watch?v=t1e8gqXLbsU
- control monad
- Maybe - https://www.youtube.com/watch?v=b9FagOVqxmI
- Either
-
Haskell em produção
- Comunicação entre linguagens
- Paralelismo e Distribuição:
- actors
-
Cálculo Lambda:
- Visão geral
- \(\alpha\)-transformação
- \(\beta\)-redução
- \(\eta\)-redução
- transparência referencial - https://takenobu-hs.github.io/downloads/haskell_lazy_evaluation.pdf
- idempotência
-
Test
- HSpec
- quickcheck - https://www.cs.umd.edu/class/spring2019/cmsc388F/lectures/randomized-testing.html
- quickcheck + Hspec https://hspec.github.io/quickcheck.html
- Test com IO
-
Exercícios/Provas
- https://www.cantab.net/users/antoni.diller/haskell/questions/quest07.pdf
- https://exercism.io
- https://www.cse.chalmers.se/edu/year/2018/course/TDA555/exam.html
- https://www.cse.chalmers.se/edu/year/2018/course/TDA555/ex-week2.html
- https://haskell.mooc.fi/part1#sidenote-the-.-and-operators
- https://cs.anu.edu.au/courses/comp1100/lectures/
-
Pequenos projetos
- jogo da forca para demonstrar IO
- jogo da velha para demonstrar IO e um pouquinho de IA
- torres de hanoi
- bomberman
-
Exemplo de nota de rodapé. ↩