Linguagens e Ambientes de Programação (2022/2023)



Teórica 02 (08/mar/2023)

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


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. Considere a função fact, assim definida:

Avaliação com 7 reduções:

Outro exemplo de avaliação que termina e usa 3 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:

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!



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: As regras de precedência dos operadores são semelhantes às do Java. Por exemplo, o "*" tem precedência sobre o "+".

Nas chamadas de função, tais como f x, os nomes da funções têm a máxima precedência. Por isso, por exemplo, a expressão f x + g x não precisa de parêntesis.

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.



Vídeos antigos

Estes vídeos poderão estar um pouco desatualizados, pois foram feitos no contexto duma edição anterior do LAP. Contudo, partes dos vídeos poderão continuar a ter alguma utilidade.

70 70