Linguagens e Ambientes de Programação (2017/2018)



Teórica 02 (08/mar/2018)

Paradigma de programação funcional
Elementos essenciais da linguagem OCaml.
Avaliação de expressões em OCaml.
Tipos em OCaml. Tipos básicos e tipos estruturados. Inferência de tipos. Funções monomórficas e funções polimórficas. Não há sobreposição.
Listas. Construtores de listas. Emparelhamento de padrões. Exemplos.




Numa das próximas aulas teóricas (provavelmente na teórica 7) iremos discutir a noção de paradigma de programação em geral e identificar os conceitos de base de alguns paradigmas concretos como o paradigma imperativo e o paradigma orientado pelos objetos.

Para já, eis as características essenciais do...

Paradigma de programação funcional

Um pouco mais abaixo, poderá observar alguns exemplos de avaliação de expressões, no contexto da linguagem OCaml.


Linguagem OCaml



Xavier Leroy

Didier Rémy

Damien Doligez

Jérôme Vouillon

Algumas características


Porque vamos trabalhar com a linguagem OCaml?

Na nossa cadeira, vamos trabalhar com a parte funcional da linguagem OCaml por diversas razões. Eis as principais:

Elementos essenciais da linguagem OCaml

Exemplo de função recursiva que usa os dois mecanismos:

Para já é tudo! Você já ficou a conhecer o núcleo da linguagem!


Avaliação de expressões em OCaml

A ideia de avaliação está no centro do processo de execução de programas funcionais. Merece pois a nossa melhor atenção.

Em OCaml as expressões são avaliadas usando uma estratégia chamada call-by-value: uma funções só é aplicada aos seus argumentos depois de eles terem sido avaliados (ou, mais simplesmente, uma função só pode ser aplicada a valores). Esta é a estratégia usada na maioria das linguagens incluindo: Java, C, C++, Pascal, etc.

Exemplo de avaliação que termina e usa três reduções:

        (fun x -> x+1)(2+3)
        = (fun x -> x+1)5
        = 5+1
        = 6

Exemplo de avaliação que não termina:

Considere a função loop.

Avaliação:

Agora, mais uma avaliação que termina. Considere a função fact, assim definida:

Avaliação com 7 reduções:

Tipos em OCaml

Um tipo representa uma coleção de valores e tem associados um conjunto de literais e um conjunto de operações. Recordemos que um literal é uma expressão que não precisa de ser avaliada e denota um valor particular.

Para descrever um tipo precisamos pois de dizer quais são os valores, os literais e as operações.

Tipos básicos do OCaml

Tipos compostos do OCaml

Inferência de tipos

O tipo dos argumentos e do resultado das funções não se declaram em OCaml. A implementação faz inferência de tipos: ela infere para cada função o tipo mais geral que é possível atribuir a essa função.

Qual o tipo das seguintes funções anónimas?

As quatro primeiras funções dizem-se monomórficas porque só aceitam argumentos de tipos fixos.
A duas últimas funções dizem-se polimórficas pois aceitam argumentos de tipos diversos.
De todas estas funções, as duas últimas são as únicas que aceitam mais do que um argumento.
O tipo duma função com n argumentos tem sempre n setas no nível exterior. A explicação disto será estudada mais tarde.

No caso duma função pouco complicada, o programador de OCaml deverá saber olhar para ela e deduzir o seu tipo. O primeiro exercício da prática 2 é dedicado a este assunto.

Não há sobreposição (overloading)

A linguagem OCaml não suporta sobreposição (overloading) de nomes ou operadores. Sobreposição é incompatível com inferência de tipos.

Por exemplo, em OCaml o seguinte operador denota apenas a soma inteira

e o seguinte operador denota apenas a soma real

Para contraste, as linguagens C, C++ e Java suportam sobreposição. Por exemplo, em Java o operador "+" denota três operações distintas: soma de inteiros, soma de reais, concatenação de strings.

Operadores

Para alguns dos operadores mais usados em OCaml, eis uma tabela de correspondência entre o OCaml e o Java:

Comentários



Listas homogéneas em OCaml

O tipo lista, é um tipo estruturado muito usado em OCaml. Na 2ª aula prática vamos começar já a resolver problemas com listas.

Apresentam-se aqui os três elementos essenciais das listas em OCaml:

Listas literais

Exemplos de listas literais:

Construtores de listas

Estão disponíveis dois construtores de listas que, como o nome indica, servem para construir listas novas: O operador :: é associativo à direita.

Exemplos de utilização de cons:

Processamento de listas usando emparelhamento de padrões

O processamento de listas efetuar-se por análise de casos, usando a construção match e padrões. Exemplo:

A função anterior trata dois casos, cada um dos quais tem um padrão diferente associado. Os vários casos são analisados sequencialmente, de cima para baixo.

Mais um exemplo. A seguinte função aplica-se a uma lista de pares ordenados e troca entre si as componentes de cada par:

Na próxima aula estudaremos um método sistemático que nos ajudará a escrever funções recursivas sobre listas.

Em todo o caso, o princípio presencial é o seguinte:



#120