2019.2 Programação Funcional

Horários:24T12 [13h00–14h40]
Sala de aulas:A305
Sala do prof:A225
Contato:thanos@imd.ufrn.br
Horário de atendimento:mande email para marcar
Uso do servidor:tips
Turmas anteriores: 2018.1

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 paralela e concorrente, programação com tipos dependentes.

Prerequisitos

  • Óbvios:
    • {vontade, tempo} para {hackear, praticar, procurar, implementar, programar} nos assuntos da disciplina;
    • 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.
  • Experiência com programação não-funcional (disfuncional) atrapalha mas NÃO será estritamente proibida. ;)
  • Nada mais!

Para o lado prático da disciplina e seus trabalhos, vamos precisar as noções básicas de Unix e familiaridade com git.

Unix tips

Bibliografia

Principal

  • Hutton: Programming in Haskell
  • Bird: Thinking Functionally with Haskell

Papers

Auxiliar

Links

Haskell ; Idris ; PureScript ; Neovim ; Emacs

Avaliação

Pontos

A disciplina não é dividida em 3 unidades (vejá Conteudo). Mesmo assim, cada aluno vai receber 3 notas, de 0 a 100 pontos. A nota U1 corresponde no LiveCoding; a U2 na prova escrita. A pior dessas duas notas sera a nota U3, exceto se o aluno optar para desenvolver um projeto, nesse caso a nota da U3 seria o max{nota-projeto,min{nota-livecoding,nota-prova}}.

Alem desses pontos, um aluno pode ganhar pontos extra: por participação; por homework; ou por provas-surpresas. Esses pontos valem igualmente com os pontos de provas escritas. Estou tenando ao máximo ser justo com esses pontos, mas nenhuma justificativa será dada por ganhar (ou não ganhar, ou perder!) pontos extra.

Umas regras: (1) nunca dê uma resposta que tu não pensou sozinho; (2) não tente “forçar a barra” dando respostas aleatórias nas minhas perguntas com objetivo único de ganhar pontos extra.

Umas provas escritas podem ter pontos bônus. Esses são pontos que são condicionalmente considerados: para considerá-los um aluno precisa ter pelo menos 50pts normais (não-bônus). As questões que valem pontos-bônus são em geral em assuntos auxiliares que, mesmo que merecem ser reconhecidos, não devem ser determinantes para aprovar na disciplina.

Presenças

Veja notícia no SIGAA para informações sobre presenças, chamadas, etc.

Live Coding

Durante cada aula, tem um momento onde eu boto um desafio para resolver (programar) na hora, no servidor, que envolve a criação dum certo arquivo (em geral o arquivo é um programa Haskell, que deve ser compilável pelo compilador do servidor).

O que serve esse arquivo?

  • a existência dele serve como "chamada";
  • a corretude do programa nele, serve como pontos para a unidade correspondente.

participantes ativos:
arnaldoeloi arturprocopio danbarbosa doug er9 eudnaolivio fortaleza555 gabriel giordanorn gustavo hdgamer21 joelfelipe338 junior karinepcdc leonandro marujo mauricio nalbertg patrick patricko ruivenzo songcosta versinho
nunca entraram:
sem conta:
(O resto dos alunos. Cadê?)

Projeto

Mais informações logo.

Veja os tutoriais seguintes:

Estude o capítulo 15 de Thompson.

O RWH é muito antigo (dated) para seguir seus exemplos fielmente, mas suas idéias para programar no mundo real são aplicáveis, e o fato que tem comentários de leitores em cada parágrafo ajuda demais.

Tristeza com strings:

Provas

Material para ajudar na preparação para a prova

Isso não quis dizer que na prova vão cair (apenas) problemas desses assuntos

  • Homework modules: ExNat, ExList, ExMaybe, ExEither, ExFold, MySort
  • Hutton: 5, 6, 7, 16
  • Bird: 3, 4, 6
  • fmcbook: o capítulo «Os números naturais: recursão; indução»

Prova U2

  • Prova (única) escrita (pts: 100; bonus: ?) (dia: ?)

Homework

Os arquivos existem no servidor no ~/funfiles.

Olhem com freqüência para possíveis modificações/correções!

Pre...

  1. Instale a Haskell no teu sistema. Vai precisar instalar o tool stack. Siga as instruções nos sites.
  2. Aprenda os básicos de pelo menos um dos dois editores que prestam:
    • para o (neo)vim, complete seu tutorial: execute o vimtutor
    • para o Emacs, complete seu tutorial: execute o emacs, e siga as instruções para entrar no tutorial.
  3. Se acostume com o canal IRC de Haskell.
  4. Especialmente se tu programa em Java, dê uma olhada em Scala. Vale a pena assistir os primeiros minutos dessa palestra (especialmente os exemplos com o código que começa no tempo 8m45s).
  5. Especialmente se tu já programou em JavaScript, dê uma olhada na Elm. Tente modificar esse exemplo, para adicionar um feature nele, mesmo sem ter visto Elm nunca antes. Por exemplo, tente adicionar um botão Reset que zera esse contador. Compare essa solução com o jeito que tu faria isso em JavaScript pura.
  6. Se nunca programou em LISP, comece aprender uma! Sugiro brincar com Racket, e criar suas próprias linguagens de programação!
  7. Comece estudar o LYAH (veja na bibliografia).

(Obs: não vamos usar nenhuma LISP, nem Scala, nem Elm nessa disciplina! É só pra tua diversão mesmo.)

24/07/2019

  1. Estude a secção «Um toque de lambda» do capítulo «Funções» do [fmcbook].

15/08/2019

  1. Estude os capítulos 3 e 4 do [Hutton]
  2. Estude os capítulos 2–4 do [LYAH]
  3. Estude os «linguagens» e «Naturais, recursão, indução» do [fmcbook]
  4. Defina todos os undefined no ExBool.hs

Pontos extra

Nenhum por enquanto.

Histórico de aulas

24/07/2019: Intro [video]

  • Burocracia da disciplina
  • Linguagens de programação
  • Tipagem
  • Estratégia de evaluação
  • λ-calculus

29/07/2019: Mini-curso Unix [video]

31/07/2019: Mini-curso Unix [video]

02/08/2019: Mini-curso Unix [video]

05/08/2019: primeiros passos [video]

  • o REPL da Haskell: ghci
  • tipos, type inference
  • currificação
  • domínio e codomínio de função
  • o → dos típos é associativo à direita: a → b → c → d significa a → (b → (c → d))
  • prefixa vs infixa; nomes com letras vs com símbolos
  • backticks para usar função com nome normal em posição infixa
  • a aplicação de função é associativa à esquerda: f x y z significa ((f x) y) z
  • difernçá com as parenteses de LISP
  • todas as funções são de aridade 1?
  • oi
  • teoria: type inference; currificação
  • types: Char; Ιnt
  • type constructors: – → –; [–]
  • type classes: Num
  • ghci: :type
  • funções: (+); (++); reverse; min; fst

07/08/2019 [video]

  • setting up
  • nosso primeiro arquivo (module)
  • módulo: uma colecção de declarações (definições)
  • nosso primeiro erro e como ghci é um amigo
  • sempre escreva os tipos
  • inferindo tipo sem nenhum cálculo
  • usando o it no ghci
  • não confunda o = da haskell com assignment
  • variáveis vs constantes; proibido redefinir algo
  • x = valor no ghci vs em Haskell
  • nossa primeira função
  • variáveis
  • escópos
  • sombreamento (shadowing) e capturamento de variáveis
  • erro de ética
  • o modelo computacional da Haskell
  • açúcar sintáctico e desugaring
  • mais shadowing/capturamento de variáveis
  • undefined; cálculos infinitos; lazy vs strict
  • o tipo de undefined
  • inconsistência lógica de Haskell
  • um erro de tipagem: cuidado com as parenteses
  • um erro de tipagem: cuidado com as parenteses
  • precedência e associatividade de operadores binários
  • definições com mais que uma equação
  • a ordem de equações numa definição importa
  • usando o _
  • Av.hs: média de dois números
  • teoria: o modelo computacional da Haskell; lazy vs strict evaluation; versão baby de teorema Church-Rosser; açúcar sintáctico; inconsistência lógica
  • types: Integer
  • ghci: :edit :info it
  • haskell: modules; comentarios com --; a ordem de equações numa definição importa; undefined; precedência e associatividade de operadores binários; o _ casa com qualquer termo sem dar nome a ele

12/08/2019: Types e kinds [video]

  • Recap
  • melhor considerar o = da Haskell como direcionado da esquerda pra direita
  • estratégias de evaluação
  • definindo usando equações e suas variáveis
  • a ordem de equações numa definição importa
  • usando o underscore
  • a ordem das definições num módulo não importa
  • Int vs Integer; typeclass Integral
  • LiveCoding passado: o typeclass Fractional
  • Uma resolução não currificada
  • Pattern matching com tuplas
  • Tipos; typeclasses; construtores de tipos; kinds
  • dois [] diferentes
  • mais: kinds vs types
  • dois (,) diferentes
  • criando nossos próprios tipos
  • Weekday
  • habitantes de tipos
  • nextDay
  • opção de ghci: +t
  • Show
  • deriving (Show)
  • nextWorkingDay: três versões
  • imitando Haskell para evaluar uma expressão
  • inferando o tipo
  • redex
  • preguiça, mas...
  • quanto dum valor Haskell vai calcular?
  • quantas vezes vai efetuar o mesmo cálculo?
  • aplicação de função, precedência, associatividade do apply default (espaço) vs ($)
  • Boolean.hs
  • teoria: ontologia de haskell: types vs kinds ; type constructors ; habitantes de tipo ; redex
  • types: Bool
  • type constructors: [] (→) (,) (,,)
  • type classes: Fractional ; Integral ; Show
  • Haskell: data ; dois objetos diferentes chamados [] e dois chamados (,) etc. ; indentação ; deriving ; usando ' nos nomes ; ($)
  • ghci: :kind ; :set +t

14/08/2019: primeiros passos [video]

  • Recap
  • Prelude
  • LiveCoding anterior: booleanos
  • Mais sobre nossos booleanos
  • if-then-else expressions
  • igualdade: (==) e Eq
  • typeclasses e instanciando tipos
  • Os números naturais
  • construtor de valores vs função
  • a typeclass Num
  • estilo pointless (ou point-free)
  • mais sobre infix vs prefix
  • Haskell é preguiçosa mas não pode inferir do nada teoremas para ajudar sua preguiça
  • mais sobre construtor de valores vs função
  • Nats.hs
  • theory: Nats; recursão; construtor de valores vs função
  • types: Nat
  • typeclasses: Num, Eq
  • Haskell: Prelude, instance ; if-then-else

Futuro (fluido)

19/08/2019: algebraic data types

21/08/2019: algebraic data types

26/08/2019

28/08/2019

02/09/2019

04/09/2019

09/09/2019

11/09/2019

16/09/2019

18/09/2019

23/09/2019

25/09/2019

30/09/2019

02/10/2019

07/10/2019

09/10/2019

14/10/2019

16/10/2019

21/10/2019

23/10/2019

30/10/2019

04/11/2019

06/11/2019

11/11/2019

13/11/2019

18/11/2019

20/11/2019

25/11/2019

27/11/2019

02/12/2019

04/12/2019

Last update: Fri Aug 16 22:43:51 -03 2019