2024.2 Programação Funcional

Horários de aula: 46T12♯ [13h05–14h45]
Sala: B203
Contato:thanos@imd.ufrn.br
Playlists: FMC1 2019.2 (aulas gravadas)
Monitoria/TA: fmc.imd.ufrn.br
Turmas anteriores: ..

Info

Pré-requisitos

  • É necessário que os alunos matriculados têm tempo e vontade para estudar, fazer os trabalhos atribuídos, etc.

(Obs.: estudarler.)

Veja minhas dicas para estudantes, que inclui pré-requisitos para esta disciplina.

Experiência com programação não-funcional (disfuncional) atrapalha mas NÃO será estritamente proibida. ;)

Obs.: fluência em pelo menos um dos dois editores de texto que prestam (Vim & Emacs) ajuda em qualquer tarefa que envolve criação de arquivos de texto. Programação é uma delas.

Conteúdo

Conceitos de programação funcional, introdução ao lambda calculus, o modelo de computação de programação funcional, tipos de dados, recursão, programação de ordem superior, evaluação preguiçosa, dados infinitos, I/O, classes de tipos, monads. Raciocinando sobre programas, indução, parseando, programação com tipos dependentes.

Bibliografia e referências

Conhece o libgen?

Principal

Auxiliar

Dicas

Veja minha página de dicas para estudantes.

Links

Tecnologias & ferramentas

Obs.: As tecnologías/ferramentas seguintes podem mudar durante a disciplina—exceto a primeira. (Instalem e/ou criem uma conta para usar onde necessário.)

  1. PAPEL (um caderno para dedicar à disciplina) e LAPIS/CANETA.
  2. Zulip (leia o FAQ).
  3. A linguagem de programação Haskell;
  4. A linguagem de programação e proof assistant Agda;
  5. A linguagem de programação e proof assistant Lean 4;
  6. Git (leia o FAQ).
  7. Muito recomendado mas não necessário: Neovim e Emacs (alternativa popular: VS Code).
  8. Muito recomendado mas não necessário: um sistema Unix (veja o minicurso Unix 2019.2).

Como instalar tudo isso? Leia o FAQ.

Regras

  1. Nunca escreva ou diga algo que você mesmo não sabe explicar: (i) o que significa; (ii) seu papel na tua resolução. Por exemplo: um aluno escreveu a frase seguinte na sua demonstração: «Como f é cancelável pela esquerda temos que g=h». Ele deve saber o que significa ser cancelável pela esquerda e também explicar como isso foi usado e/ou o que isso tem a ver com essa parte da sua demonstração.
  2. Qualquer trabalho ou resposta dada poderá ser questionado em forma de prova oral, em modo privado ou aberto. Se um aluno não consegue explicar o que ele mesmo escreveu numa resolução, será considerado plágio (veja abaixo).
  3. Participando, nunca dê uma resposta que tu não pensou sozinho, exceto dando os devidos créditos correspodentes.
  4. Não tente “forçar a barra” perguntando ou respondendo coisas aleatórias com objetivo de ganhar pontos. Os pontos de participação não correspondem em apenas perguntas ou dúvidas que mostram interesse. O interesse é implícito pelo fato que tu escolheu matricular nesta turma—não vale pontos.
  5. Não procurem resoluções em qualquer lugar fora dos indicados em cada homework. O único recurso automaticamente aceitável para procurar ajuda é no nosso Zulip (especificamente seus canáis públicos—não DM) e a monitoria.
  6. Proibido consultar o apêndice de resoluções do fmcbook durante a disciplina exceto quando for explicitamente permitido por mim. (Os apêndices de dicas são permitidos sim!)

Uns deveres dos alunos

  1. Visitar este site e o Zulip da disciplina pelo menos uma vez por dia durante o semestre. (Qualquer coisa postada no site ou no Zulip da disciplina será considerada como conhecida por todos os alunos da turma.)
  2. Estudar o conteúdo lecionado e tentar resolver todos os trabalhos atribuidos.
  3. Participar no Zulip diariamente, compartilhando tuas resoluções para receber feedback, e checando as resoluções de outros colegas para dar feedback.
  4. Checar e atender seu email cadastrado no SIGAA pelo menos uma vez por dia durante o semestre.
  5. Participar nas aulas! Obs.: tendo uma dúvida durante a aula, levante a mão para solicitar “a fala” e assim que a receber, pergunte! Não espere o fim da aula para discutir tua dúvida em “modo particular”! A maioria das vezes eu vou negar isso e pedir ao aluno iniciar a discussão no Zulip ou na próxima aula.
  6. Participar no Zulip diariamente, compartilhando tuas resoluções para receber feedback, e checando as resoluções de outros colegas para dar feedback.
  7. Participar nas aulas de exercícios de monitoria e utilizar seus horários de atendimento para tirar dúvidas.

(Veja também os FAQs relevantes.)

Sobre plágio

  1. Plágio detectado implica que o aluno será reprovado na disciplina imediatamente por nota e por faltas.
  2. Entregar tuas resoluções para um aluno copiar é proibido do mesmo jeito, e também não ajuda mesmo ninguém.

Cadernos vs. celulares

Não faz sentido aparecer na aula sem caderno. E não faz sentido aparecer na aula com celular ligado; bote no modo avião antes de entrar na sala. As aulas são interativas e se não pretende participar e concentrar nesses 100 minutos, sugiro ficar fora e escolher uma outra maneira de passar teu tempo. Não é necessário (e obviamente nem suficiente) aparecer nas minhas aulas para passar.

Avaliação e faltas

Disclaimer. Eu suponho que os alunos desta turma escolheram se matricular por interesse em aprender seu conteúdo. O ideal seria ignorar assuntos irrelevantes de avaliação, presenças, carga horária, etc., e se jogar nos estudos e nas brigas (nas aulas, no Zulip, e na monitoria).

Avaliação

A nota final de cada aluno vai ser principalmente baseada em um ou mais dos: (i) provas escritas; (ii) sua participação; (iii) trabalhos atribuidos; (iv) hw resolvidos (veja o FAQ relevante).

Presenças e faltas

A presença pela regulação da UFRN é obrigatória. Os alunos que não gostam/querem/podem aparecer nas minhas aulas ainda têm chances de ganhar até nota máxima e aprovar na disciplina. Ou seja: alunos que escolhem não participar ou aparecer nas aulas, e mesmo assim aparecem nas provas escritas e conseguem nota final de aprovação vão ter sua porcentagem de faltas ajustada para não reprovar por faltas. Esclarecimento: alunos que não conseguem nota final de aprovação não terão sua porcentagem de presença ajustada de jeito nenhum e por nenhum motivo.

Obviamente, alunos que não aparecem nas aulas não terão como ganhar pontos de participação em aula—duh!—nem pontos de possíveis provas-surpresas.

As presenças/faltas serão cadastradas usando o sistema Plickers (veja o FAQ relevante).

Atrasados

Definição (atrasado). Seja $a$ aluno desta turma. Dizemos que $a$ é atrasado sse $a$ não está já sentado na sua mesa, com seu caderno já aberto, seu celular já desligado e na mochila, no momento que a aula começa.

Tentem estar presentes na sala da aula ANTES do horário do seu começo, e fiquem até o fim da aula.

Caso que alguém chega atrasado: não faz sentido bater na porta da sala de aula; não faz sentido cumprimentar nem o professor (não é mostra educação cumprimentar nesse caso—pelo contrário!) nem os amigos/colegas da aula. Entrando numa sala onde a aula já começou, tentem fazer sua entrada o menos possível notada por os participantes pois atrapalha a concentração de todos.

FAQs

Dynamic content

Pontos de participação

Provas

Provas surpresa. Note que em qualquer aula pode ter prova surpresa, cujos pontos são considerados «pontos extra», assim sendo possível tirar nota máxima (100), mesmo perdendo todas as provas surpresas.

Provas não-surpresa. Tais provas serão avisadas com curtíssima antecedência (de pelo menos 16h). A melhor maneira de lidar com isso é tratar todo dia de aula como possível dia de prova.

U1

U2

  • Prova 2 / 100pts (2025-01-08) { censored , uncensored , answers , correções }

U3

Sem informações por enquanto.

Homework (HW)

Leia bem o FAQ sobre hw. Note também que:

  • Homeworks são atribuidos também durante as aulas e no Zulip.
  • Homeworks marcados assim são auxiliares; tente apenas se tu tem resolvido uma parte satisfatória dos outros.

2024-10-07 (hw01)

  1. Defina (sem consulta) a adição, a multiplicação, e a exponenciação (nos Nats).
  2. Calcule os:
    1. 2 + 3
    2. 3 + 2
    3. um dos: 4 · 1; 1 · 4
  3. Defina uma função double que retorna o dobro da sua entrada.
  4. Calcule os:
    1. double (double (S O))
    2. double ((S O) + (S (S O)))
  5. Demonstre uma das: (·)-idL, (·)-idR
  6. Demonstre uma das: (^)-idL, (^)-idR
  7. Defina a função pred : Nat → Nat de “predecessor”, onde consideramos que o predecessor de zero é o próprio zero mesmo: AVISO: a maioria das vezes que um aluno de 2022.1 e de 2022.2 usou a pred em outras definições, estava errando
  8. Defina as funções:
    1. fact : Nat → Nat
    2. fib  : Nat → Nat
    3. min  : Nat × Nat → Nat
    4. max  : Nat × Nat → Nat
    5. div  : Nat × Nat → Nat × Nat
    6. quot : Nat × Nat → Nat
    7. rem  : Nat × Nat → Nat
    8. gcd  : Nat × Nat → Nat
    9. lcm  : Nat × Nat → Nat
  9. Instale Haskell, Agda, e Lean no teu sistema (veja o FAQ).
  10. Implemente em Haskell todas as tuas definições dos exercícios acima.
  11. Clone o meu repositório mencionado no FAQ do Git.
  12. Crie o teu repositório mencionado no FAQ do Git.
  13. fmcbook §«Um toque de lambda»
  14. fmcbook Cap. 4: «Recursão, Indução»: §«Definindo funções recursivamente»
  15. [Hutton] Cap. 3

2024-10-11 (hw02)

  1. Cap «Recursão; Indução»: até a §«Demonstrando propriedades de naturais sem indução»
  2. Cap «Recursão; Indução»: §«Abusando um tipo para implementar outro»; §«Os Bools»; §«O ListNat»

2024-10-18 (hw03)

  1. Ache no hw/ do meu repo, copie para o teu, e resolva os:
    • ExNat
    • ExBool
    • ExList
    • ExCurry
    • ExHyper

2024-10-26 (hw04)

  1. fmcbook: Cap. Funções: §«Composição»
  2. fmcbook: Cap. Funções: §«Definições estilo point-free»
  3. Desafio: implementar um data type para os inteiros

2024-11-01 (hw05)

  1. Demonstre que: bnot é uma involução: bnot . bnot = id
  2. Complete as igualdades e demonstre:
    take n xs ++ drop n xs  =
    take m . drop n  =
    take m . take n  =
    drop m . drop n  =
    map g . map f  =
    sum . map double  =
    sum . map sum  =
    sum . sort  =
    map f . reverse  =
    concat . map concat  =
    filter p . map f  =
    
  3. Quais das seguintes são válidas e quais não?
    map f . take n  =?=  take n . map f
    map f . reverse  =?=  reverse .map f
    map f . sort  =?=  sort . map f
    filter (p . g)  =?=  map ginvl . filter p . map g
    reverse . concat  =?=  concat . reverse . map reverse
    filter p . concat  =?=  concat . map (filter p)
    
    (suponha aqui que a ginvl é um inverso esquerdo da g, ou seja: glinv . g = id
  4. Complete as igualdades e investigue:
    length . reverse  = 
    reverse . reverse  = 
    (xs ++ ys) ++ zs  = 
    map id  =  
    map (f . g)  =  
    length (xs ++ ys)  = 
    sum (xs ++ ys)  = 
    product (xs ++ ys)  = 
    concat (xss ++ yss)  = 
    filter p (xs ++ ys)  = 
    map f (xs ++ ys)  = 
    

2024-11-22 (hw06)

  1. Aproveite Records nos teus programas até agora e brinque com a sintaxe
  2. Dadas funções f : α → γ e g : β → δ mostra como definir ? : α × β → γ × δ (i) manualmente; (ii) aproveitando algo sobre um (×) que aparece aí (qual dos dois, e qual é o tal algo?)
  3. Dadas funções f : α → γ e g : β → δ mostra como definir ? : α + β ← γ + δ (i) manualmente; (ii) aproveitando algo sobre um (+) que aparece aí (qual dos dois, e qual é o tal algo?)
  4. Desenhe, adivinhe, e demonstre:
    1. ⟨outl, outr⟩ = ?
    2. ⟨f,g⟩ = ⟨k,h⟩ ⇒ ?
    3. ⟨f∘h,g∘h⟩ = ?
    4. (f×h)∘⟨g,k⟩ = ?
    5. $1_A \times 1_B = {?}$
    6. (f×h)∘(g×k) = ?

Histórico

Quadro das aulas

2024-09-25: (1) Meta & Intro

  • Linguagens de programação

2024-09-27: (2) Tipos

  • (→) e (×)

2024-10-02: (3) Tipos

  • de buracos para (↦) para λ
  • currificação
  • duas definições de double : Int → Int
  • números vs numerais
  • 4 maneiras diferentes de definir o tipo Nat

2024-10-04: (4) Nat

  • o que «aridade» pode significar: currificamente ou descurrificamente
  • o modelo computacional de programação funcional
  • uma definição de soma: _+_ : ℕ → ℕ → ℕ
  • 2 + 3 = 5
  • 2 + 3 ≢ 3 + 2
  • estratégias de evaluação: lazy vs strict
  • infinity : Nat e five infinity

2024-10-09: (5) fun with GHCi

  • (apanhando num computador-não-meu, usando um teclado-não-meu)
  • como definir a (·)
  • Brincando com ghci
  • Ints, Bools, Listas, Strings built-in da Haskell (no Prelude)
  • modules: importar, definir
  • list comprehension
  • trabalhando com «valores infinitos»
  • let-in expressions
  • if-then-else expressions
  • sombreamento de variáveis
  • inconsistência de Haskell
  • bottom : α
  • error : String → α
  • mensagens de erro no GHCi e como interpretá-los

2024-10-11: (6) more types

  • raise awareness: stop abusing types
  • abusing Nats
  • novo tipo: Bool
  • novo tipo: Weekday
  • novo tipo: ListNat
  • tipos (propriamente) recursivos
  • duas interpretações de um construtor Nat → ListNat: colchetor, looper
  • length

2024-10-16: (7) polimorfismo, type classes, desconstrutores

  • desconstrutores de construtores
  • head, tail, pred
  • polimorfismo: a (família de funçoẽs) id : α → α
  • especificação vs implementação
  • typeclasses
  • a typeclass Num
  • a typeclass Show
  • a typeclass Eq
  • implementação padrão em typeclass

2024-10-18: (8) blah-expressions, list toolkit

  • match-with / case-of expressions
  • let-in expressions
  • patterns nos let-in
  • uso de desconstrutores como sinal de algum possível problema
  • if-then-else expressions
  • guards
  • o tipo Char e umas maneiras de defini-lo
  • o 'a' * 2 faz sentido em C
  • abstraindo a parte comum de definições
  • a map
  • duas maneiras de interpretar o tipo da map
  • a filter
  • duas maneiras de interretar o tipo da filter
  • de umas definições de 2 linhas para algo melhor: 1 linha só
  • de definiçoes de 1 linha só para algo melhor: 1 linha curta
  • algo ainda melhor: 0 linhas!

2024-10-23: (9) map, filter, fold

  • como implementar notações de list comprehension
  • sum, prod, and, or
  • ($)
  • notação de section: (^ 2), (2 ^), etc.
  • fold associando à esquerda e à direita

2024-10-25: (10) composição

  • composição de funções
  • quebrando o problema de definir ? : α → ω para iluminar a situação
  • point-free / pointless / tacit programming
  • a Δ : α → α
  • o que significa «a óbvia função de tal tipo»

2024-10-30: Prova 1

2024-11-01: (11) Indução

  • at-patterns
  • ArEx
  • tentativa de demonstração de (+)-ass sem indução
  • o princípio da indução
  • construtores respeitando propriedades

2024-11-06: (12) Caçando teoremas

  • descubrindo teoremas
  • demonstrações por indução
  • comandos e o estado duma demonstração: Dados/Alvo
  • Basta _.
  • recursão e indução
  • Θ. (+)-ass
  • igualdade entre funções
  • Θ. length ∘ map f = length
  • Θ. length = sum ∘ map (const 1)

2024-11-08: (13) Unit, Empty, Maybe

  • Unit (𝟘)
  • Empty (𝟙)
  • Entendendo tipos através de maneiras de chegar neles e de sair deles
  • Maybe α

2024-11-13: (14) Either, Functors

  • Either α β
  • Functors
  • As leis de functor

2024-11-22: (15) Records, (Co)products, Diagrams

  • Record types
  • Diagramas comutativos
  • Product types
  • Coproducts (sums)

2024-11-27: (16) Indução, diagramas comutativos

  • Θ. sum (xs ⧺ ys) = sum xs + sum ys
  • mais produtos
  • mais funções de graça: cross, plus
  • mais diagramas comutativos

2024-11-29: (17) IO

  • IO a
  • pure, do-notation
  • putChar, getChar
  • putStr

2024-12-04: (18) FAM: Applicative

  • Applicative typeclass
  • Applicative instances for IO, Maybe, List

2024-12-06: (19) SMG, valores ambiguos e temporais

  • Semigrupo
  • cópias isómorfas de tipos: newtype
  • interpretações computacionais
  • valores ambígulos
  • valores temporais
  • produto cartesiano de listas

2024-12-11: (20) thunks, pointfree proofs, laws

  • do laws
  • applicative laws
  • thunks, :sprint, seq
  • demonstrações sem pontos

2024-12-13: (21) efficiency by induction, sorting

  • eficiência “por indução”
  • uma reverse de complexidade O(n)
  • merge sort
  • quick sort
  • insertion sort

2024-12-18: (22) fold, applicatives and functors, isomorphic copies

  • folds para Listas: foldr, foldl
  • folds para Nats
  • Temporal α vs Ambiguous α como applicatives e seus fmaps
  • cópias isomórficas de tipos: type vs data vs newtype

2024-12-20: (Cancelada)

Futuro (fluido)

2025-01-08: Prova 2; (23)

2025-01-10: (24)

2025-01-15: (25)

2025-01-17: (26)

2025-01-22: (27)

2025-01-24: (28)

2025-01-29: (29)

2025-01-31: (30)

Last update: Fri Dec 20 20:40:19 -03 2024