Teoria das Categorias para Programadores
Table of Contents
1. Apresentação do Curso
Teoria das categorias é uma área da matemática que estuda estruturas abstratas com foco no relacionamento (morfismos) entre objetos. As categorias possuem duas propriedades básicas: a existência de um morfismo identidade e um operador de composição entre dois morfismos.
A composição remete a forma como programamos um algoritmo: dividindo um problema em pequenos pedaços, resolvendo cada um deles, e compondo as funções criadas.
Muitos dos padrões estudados em categorias podem ser traduzidas diretamente para designs de programação que incentivam a criação de códigos genéricos, concisos, redução de boilerplate codes, diminuição do uso de mutabilidade e abuso variáveis globais, dentre outros benefícios.
Como exemplos notáveis temos as estruturas optional do C++, Streams do Java, Monoids no C++, etc.
Esse estudo também motivou um novo design de programação chamado de Type-driven development (em contraste com Test-driven development) em que o objetivo, diferente do que estamos acostumados, é dificultar a compilação do código para que, quando compilar, ele tenha menor chance de conter bugs.
Esse curso foi montado baseado no livro disponível gratuitamente em https://bartoszmilewski.com/2014/10/28/category-theory-for-programmers-the-preface/ com diversos exemplos complementares.
O foco será em como podemos utilizar as diversas construções de Teoria das Categorias para criarmos programas mais claros, genéricos e com menor chance de erros.
Os códigos mostrados durante o curso serão dados primariamente em Haskell (mas conhecimento da linguagem não será um pré-requisito) e, em boa parte do curso, também em C++ e Python.
Objetivos
Permitir a identificação de padrões comuns durante a fase de planejamento e desenvolvimento de sistema de forma a permitir a criação de códigos corretos, concisos, genéricos e que separe as computações que geram efeitos-colaterais das funções puras.
Metodologia
Aulas teóricas intercalando conceitos abstratos da Teoria das Categorias com exemplos concretos em desenvolvimento de sistemas e discussões sobre estudos de caso. Ao final de cada aula serão passadas tarefas de programação para fixar os conceitos aprendidos e, ao final, um mini-projeto teórico ou de programação para avaliação.
Pré-requisitos
Conhecimento intermediário em alguma linguagem de programação (C++, Python, Java, Scala, Haskell)
Programação
Dia 01: Categorias, Tipos e Funções, Categoria Kleisli, Produtos e Coprodutos, Tipos de Dados Algébricos, Functors
Dia 02: Bifunctors e profunctors, tipo função, transformação natural, monoids grátis, Functors representáveis
Dia 03: Yoneda, Functors Adjuntos, Monads, Comonads
2. Datas e Sala
O curso será ministrado pelo professor Fabrício Olivetti e terá duração de 12 horas nos dias 03/08, 10/08 e 17/08 das 08h00 às 12h00 no campus da UFABC de Santo André, bloco A sala S-204-0.
3. Inscrições
- Número de vagas: 80
- Para se inscrever:
https://sig.ufabc.edu.br/sigaa/link/public/extensao/visualizacaoAcaoExtensao/808
- Para se cadastrar o usuário deve clicar em "Clique aqui para fazer a sua Inscrição" → "Ainda não possuo cadastro".
- Insira os dados solicitados e aguarde e-mail para finalização do cadastro. Após a finalização do cadastro, insira o e-mail e senha, clique em “Cursos e Eventos Abertos" e faça o cadastro no curso.
4. Como Chegar
Universidade Federal do ABC Avenida dos Estados, 5001, Bloco A, Sala 531-2 09210-580 Santo André - SP, Brazil.
Acesso pelos endereços: Av. dos Estados, 5001.
- Abolição, 378
- Santa Adélia, (em frente ao no. 221)
Estações de trem próximas: Prefeito Saladino e Santo André (CPTM L10) - recomendamos utilizar Uber para o trajeto estação-campus.
Mais informações: http://www.ufabc.edu.br/a-ufabc/campi/santo-andre
5. Material do Curso
6. Atividades e Suporte
As atividades do curso estão descritas e deverão ser submetidas pelo site https://classroom.github.com/classrooms/47036161-teoria-das-categorias-para-programadores Para submeter uma atividade, basta clicar no link da atividade para criar um novo repositório no Github, todo arquivo adicionado nesse repositório poderá ser acessado apenas pelo aluno e pelo professor da disciplina.
Atividades do Dia 01:
- Either em outras linguagens: https://classroom.github.com/a/gcdn06_h
- Funcional vs OOP: https://classroom.github.com/a/lwYodY_c
- Monoid: https://classroom.github.com/a/rAEIFYBT
- Writer: https://classroom.github.com/a/E5mNkUVM
- Zipper: https://classroom.github.com/a/vCxpDphn
Atividades do Dia 02:
- Crie seu próprio Functor: https://classroom.github.com/a/UhxaGPR9
- Lista Infinita: https://classroom.github.com/a/qFlb-lcC
- Functor Contravariante: https://classroom.github.com/a/GrWPIlHX
- Functor Representável: https://classroom.github.com/a/3m_HzYaM
Atividades do Dia 03:
- Crie instâncias de Monads e Comonads: https://classroom.github.com/a/OT6ryPcB
- Filtro de Imagens utilizando Comonads: https://classroom.github.com/a/jLVQ-hsL
Durante o curso, utilizem o Piazza (https://piazza.com/class/jyhdahj8hovz) para tirar dúvidas. Nele também serão compartilhados materiais extras.
7. Contato
- Fabrício Olivetti - folivetti@ufabc.edu.br