Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf ·...

43
Aviso Pr´ evio Bibliografia Introdu¸ ao Compila¸ ao, . . . Nucleo funcional Programa¸ ao . . . agina Pessoal agina de Rosto agina 1 de 43 Retroceder Ecr˜ a Todo Fechar Sair Introdu¸ ao ` a Programa¸ ao Funcional em OCaml Sim˜ ao Melo de Sousa

Transcript of Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf ·...

Page 1: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 1 de 43

Retroceder

Ecra Todo

Fechar

Sair

Introducao a Programacao Funcionalem OCaml

Simao Melo de Sousa

Page 2: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 2 de 43

Retroceder

Ecra Todo

Fechar

Sair

1. Aviso Previo

• A redaccao deste documento baseou-se fortemente na bibliografia indi-cada. Parece-nos entao obvio que a leitura e a aprendizagem directapelas obras originais e recomendada, e mesmo essencial a compreensaoprofunda das nocoes aqui apresentadas;

• O portugues nao e a lıngua materna do autor e o presente documentoencontra-se em fase de elaboracao pelo que se agradece e ate se incentivaqualquer sugestao ou correccao.

Page 3: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 3 de 43

Retroceder

Ecra Todo

Fechar

Sair

2. Bibliografia

Consultar [2, 3, 4, 6, 5]

Page 4: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 4 de 43

Retroceder

Ecra Todo

Fechar

Sair

3. Introducao

A linguagem LISP, criada no M.I.T. nos anos 1960, e o patriarca das lingua-gens funcionais. Muitas variantes desta linguagem apareceram, como o ELISPque e a linguagem de programacao associada ao editor de texto Emacs. Outroexemplo e a linguagem Scheme que esta, por exemplo, na base do sistema deprocessamento de imagens GIMP.

CAML e o acronimo para Categorical Abstract Machine Language quesublinha as ligacoes que esta linguagem alimenta com o calculo λ e a teoriadas categorias. A CAM (de Categorical Abstract Machine) e uma maquinaabstracta (diz-se tambem maquina virtual) capaz de definir e de executarfuncoes. A outra filiacao do nome OCaml e a linguagem ML (de Meta Lan-guage). As linguagens da famılia ML foram desenvolvidas no inıcio dos anos1980. Na origem esteve a linguagem desenvolvida por Robert Milner em 1978.Da descendencia destacamos os tres dialectos principais que sao o SML-NJ(New-Jersey, USA) , Moscow-ML (Russia) e o OCaml (Franca). Um ramo“dissidente” desta descendencia mas importante e a famılia das linguagensqualificadas de “preguicosas” como o Haskell, que sao capazes naturalmentede trabalhar com tipos de dados de tamanho infinitos.

O primeiro compilador Caml produzindo codigo para a maquina CAM foiescrito em 1984. Actualmente o compilador OCaml produz codigo para umamaquina virtual diferente e mais eficiente, chamada ZINC e escrita pelo XavierLeroy. Desde entao a linguagem OCaml tem conseguido superar um desafioque poucas linguagens conseguiram: aliar uma boa fundamentacao teorica,sinonima de robustez e fiabilidade, a eficacia do codigo produzido. Um argu-mento e por exemplo o comparativo de linguagens desenvolvido em [1] em que

Page 5: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 5 de 43

Retroceder

Ecra Todo

Fechar

Sair

a linguagem Caml fica imediatamente atras da linguagem C. Se a linguagemOCaml e uma linguagem popular nos meios academicos1 e no mundo da inves-tigacao, e tambem uma linguagem utilizada em ambiente industrial. Citemospor exemplo a industria da comunicacao telefonica (como a France Telecom)e a industria aeronautica (Dassault,...).

3.1. Heranca ML

A linguagem OCaml, como todas as linguagens herdeiras de ML, possuı ascaracterısticas seguintes:

• As funcoes sao valores de “primeira classe”: elas podem ser argumentosde outras funcoes ou mesmo o resultado de um calculo. Neste sentidodiz-se da linguagem OCaml que e uma linguagem de funcoes de ordemsuperior;

• A linguagem e fortemente tipificada: a qualquer valor esta associado umtipo. A verificacao sistematica e rigorosa da compatibilidade entre ostipos dos parametros formais e os tipos dos parametros efectivos e umadas caracterısticas da linguagem. Tal permite eliminar grande parte doserros introduzidos por “distraccao” e contribuı a uma execucao segurafiavel e robusta;

• A tipagem e inferida automaticamente: o sistema de tipo de OCaml eparticularmente expressivo e o problema da inferencia de tipo resta no

1O Caml-light e por exemplo uma variante Caml particularmente adaptada a aprendiza-gem da programacao.

Page 6: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 6 de 43

Retroceder

Ecra Todo

Fechar

Sair

entanto decidıvel. Isto e, o programador nao tem de declarar o tiposdas expressoes que define. A linguagem e suficientemente poderosa paradeduzir esta informacao a partir da sintaxe da expressao considerada.

• A tipagem e estatica: todos os tipos podem ser (e sao) deduzidos na faseda compilacao. Desta forma tal verificacao nao e necessaria durante aexecucao tornando essa ultima mais rapida;

• A tipagem e polimorfica: o algoritmo de inferencia de tipo do OCamlsabe reconhecer tipos polimorficos. Voltaremos a este assunto seccaoprecedente, mas podemos desde ja realcar que tal caracterıstica permite,de forma elegante, uma programacao modular e generica.

• Mecanismos de definicao e de gestao de excepcoes: permite uma pro-gramacao capaz de interferir com fluxo de controlo (nome generico paradefinir o decorrer de uma da execucao);

• Mecanismos de filtragem de motivos: a possibilidade de filtragem per-mite uma programacao baseada na analise dos casos possıveis.

• A memoria e gerida por um recuperador automatico de memoria(Garbage Colector ou GC, em ingles): nao ha gestao explıcita damemoria. O GC trata de tudo automaticamente e de forma eficiente.

Alem dessas caracterısticas, OCaml:

• dispoe de mecanismos proprios a programacao imperativa;

• dispoe de uma camada objecto;

Page 7: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 7 de 43

Retroceder

Ecra Todo

Fechar

Sair

• permite uma integracao de optima de programas C com programasOCaml;

• suporta a programacao concorrente, distribuıda e paralela.

Page 8: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 8 de 43

Retroceder

Ecra Todo

Fechar

Sair

4. Compilacao, Execucao e Bibliotecas

Um programa OCaml apresenta-se como uma sequencia de expressoes OCamleventualmente colocadas num ficheiro “.ml” e/ou “.mli” (um ficheiro “.mli”agrupa a interface do ficheiro “.ml” ao qual esta relacionado, tal como umficheiro “.h” e o “header” relacionado com um ficheiro “.c” na linguagem C).

Podemos executar programas OCaml de tres formas diferentes. Para cadauma delas serao preciso procedimentos diferentes.

4.1. Execucao

Interpretacao pelo toplevel : O ciclo de interaccao (toplevel na terminolo-gia inglesa) interpreta frase por frase (ou expressao OCaml por ex-pressao) o programa OCaml. Cada frase termina por dois pontos e vir-gulas : “ ;;”. Para cada expressao interpretada o toplevel devolve o tipoe o valor da expressao em caso de sucesso. O toplevel e um programachamado ocaml. Os exemplos deste documento foram todos escrito eexecutados utilizando o toplevel.Dica: preferir o comando ledit ocaml ao comando ocaml se o pro-grama ledit estiver instalado na maquina hospeda. Este programapermite guardar um historico dos programas OCaml introduzidos, asemelhanca do doskey do DOS.Para carregar uma biblioteca (OCaml ou pessoal) e preciso dis-por do ficheiro “.cmo” da biblioteca. O comando no toplevel e#load ‘‘fich .cmo ’’;; . Pode-se tambem optar por uma inclusao textual(equivalente a um copy-past do ficheiro para o toplevel). Neste caso

Page 9: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 9 de 43

Retroceder

Ecra Todo

Fechar

Sair

o comando e #use ‘‘fich .ml ’’;;

Execucao pela maquina virtual: a semelhanca do Java, os programasOCaml podem ser compilados para serem executados por uma maquinavirtual. Temos assim um programa portavel e seguro (a maquina virtualtem mecanismos de seguranca embebidos) que pode ser executado, semqualquer modificacao, numa grande variedade de arquitecturas. Paraobter tal programa, a compilacao tera de ser efectuada utilizando o com-pilador para bytecode. A maquina virtual OCaml chama-se ocamlrun. aexecucao dum programa bytecode, digamos prog, a partir dum terminalpode assim ser realizada alternativamente de duas formas:

1. ocamlrun prog

2. prog

No caso do programa bytecode tiver a maquina virtual embebida (gracasa opcao custom do compilador), basta utilizar a segunda alternativa paraa execucao do programa;

Execucao pela maquina hospeda: o utilizador por querer privilegiar a efi-ciencia em relacao a portabilidade do programa definido. Neste casopreferira utilizar o compilador nativo ocamlopt para produzir codigomaquina bem mais rapido do que o codigo interpretado. Nesta con-figuracao:

• o programa produzido e especifico a maquina em que foi compiladomas ganha-se uma factor de rapidez a volta de 10;

Page 10: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 10 de 43

Retroceder

Ecra Todo

Fechar

Sair

• o codigo produzido e codigo maquina e e executado directamentepela maquina hospeda (como qualquer programa executavel C porexemplo)

4.2. Compilacao

Existem dois compiladores (e duas variantes optimizadas de cada um deles,sufixadas por “.opt”).

ocamlc: este compilador gera codigo intermedio adequado para a maquinavirtual OCaml;

ocamlopt: este compilador gera codigo maquina adequado para ser execu-tado directamente pela maquina hospede.

Ambos aceitam as opcoes habituais dos compiladores da GNU (como ogcc).

Destacamos as opcoes seguintes:

• -i: gera para a saıda standard toda a informacao de tipos contida noficheiro compilado. Util para obter um ficheiro “.mli” por defeito;

• -c compila mas nao faz a edicao das ligacoes (nao faz o linking).Aquando da utilizacao do compilador ocamlc, permite gerar o “.cmo”correspondente;

• -custom permite a criacao de executaveis autonomos. Aquando da uti-lizacao do compilador ocamlc, permite incorporar uma maquina virtual

Page 11: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 11 de 43

Retroceder

Ecra Todo

Fechar

Sair

ao codigo produzido. Com um executavel desse nao e assim necessariaa presenca duma maquina virtual na maquina hospeda para que o pro-grama possa ser executado..

• -o nome : indica o nome desejado para o executavel;

• -I caminho : acrescenta o caminho na lista das pastas onde procurarbibliotecas.

4.3. Acesso as bibliotecas

As funcoes, valores das bibliotecas (ou modulos) sao acessıveis de duas formas:directamente (se as bibliotecas foram previamente carregadas por um open ouuse) ou por nome qualificados. Por exemplo: seja f uma funcao da biblioteca B.O acesso directo a f e f o acesso qualificado e B.f. Repare que o acesso directoe condicionado ao facto de nao haver ambiguidades no nome f. Imagine queduas bibliotecas abertas fornecem uma funcao f, tera neste caso de qualificaro nome f para ter a certeza de chamar a funcao realmente desejada. Oscomandos para o carregamento de bibliotecas sao, se tomarmos o exemplo dabiblioteca chamada bib:

• #use ‘‘bib.cmo’’ no toplevel;

• open Bib;; no ficheiro “.ml” destinado para a compilacao

No caso dos nomes qualificados, o nome da biblioteca comeca sempre poruma maiuscula.

Page 12: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 12 de 43

Retroceder

Ecra Todo

Fechar

Sair

5. Nucleo funcional

OCaml e uma linguagem funcional fortemente tipificada. Como tal, trata-se duma linguagem onde as expressoes (nas quais incluımos expressoes fun-cionais) tem um papel central. As construcoes essenciais da linguagens saoassim mecanismos de definicao e aplicacao de funcoes.

O resultado do calculo duma expressao e um valor da linguagem e a ex-ecucao dum programa e o calculo de todas as expressoes constituindo o pro-grama.

E importante realcar de que se trata duma linguagem em que valor e funcaopertencem a mesma classe. Nao ha diferencas de tratamento, por exemplo,entre um inteiro e uma funcao. Ambos sao valores para OCaml. Poderao assimserem calculados ou analisados por uma funcao. Isto e, poderao ser da mesmaforma parametro ou mesmo resultado duma funcao. Daı a denominacao defuncoes de ordem superior para as funcoes de tais linguagens funcionais.

Apresentaremos os prototipos de funcoes descritas neste documento uti-lizando a notacao OCaml para as interfaces. De forma resumida, as interfacesOCaml, agrupadas nos ficheiros “.mli” sao os equivalente OCaml do ficheirosheaders (os ficheiros “.h”) da linguagem C.

val nome da funcao ou valor : assinatura

5.1. Valores, funcoes e tipos de base

5.1.1. Numeros

Tipo inteiro: intFormato: o formato habitual (sequencia dos algarismo definindo o inteiro,

Page 13: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 13 de 43

Retroceder

Ecra Todo

Fechar

Sair

sem ponto nem virgulas)Limites: entre [−230, 230 − 1] nas maquinas 32 bits e entre [−262, 262 − 1] nasmaquinas 64 bits.

Tipo real: floatFormato: Ocaml segue a norma IEEE 754 para a representacao deflutuantes. Como tal, um flutuante e um numero real m × 10n represen-tado por um numero contendo necessariamente um ponto (que representa avirgula) cujos limites de representacao sao 53 bits para m e n ∈ [−1022, 1023].

inteiros (tipo int) flutuantes (tipo float)representacao de um 1 representacao de um 1.0adicao + adicao +.subtraccao (ou negacao) - subtraccao (ou negacao) -.multiplicacao * multiplicacao *.divisao (inteira) / divisao /.resto mod exponenciacao **

algumas funcoes sobre inteirosvalor absoluto val abs : int →intmaior inteiro representavel val max int : intmenor inteiro representavel val min int : intetc...

Page 14: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 14 de 43

Retroceder

Ecra Todo

Fechar

Sair

algumas funcoes sobre flutuantesarredondamento para o inteiro superior (em formato float ) val ceil : float →floatarredondamento para o inteiro inferior (em formato float ) val floor : float →floatraız quadrada val sqrt : float →floatexponencial val exp : float →floatlogaritmo base e val log : float →floatlogaritmo base 10 val log10 : float →floatcoseno val cos : float →floatseno val sin : float →floattangente val tan : float →floatarc-coseno val acos : float →floatarc-seno val asin : float →floatarc-tangente val atan : float →floatetc...

Consultar as bibliotecas standard para uma lista detalhada das funcoespredefinidas. Existem tambem varias bibliotecas fornecendo alternativas aostipos int e float , como a biblioteca aritmetica em precisao infinita.

5.1.2. Caracteres e strings

Os caracteres OCaml sao valores ASCII delimitados por plicas. o caracter bem OCaml e : ’b’.

As strings OCaml sao cadeias de caracteres delimitadas por aspas e decomprimento conhecido (menor do que 226 − 6). a string “Bom Dia” emOCaml e: ’’ Bom Dia’’. a concatenacao de ’’ Bom Dia’’ com ’’ Tudo Bem?’’ e’’ Bom Dia’’ ˆ ’’ Tudo Bem?’’ o que resulta na string ’’ Bom Dia Tudo Bem?’’.

Page 15: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 15 de 43

Retroceder

Ecra Todo

Fechar

Sair

algumas funcoes sobre stringsconcatenacao val (ˆ) : string →string →stringcomprimento val length : string →intn-esimo caracter val get : string →int →chartudo em maiusculas val uppercase : string →stringtudo em minusculas val lowercase : string →stringetc...

As parentesis a volta do operador ˆ significam que ˆ e infixo. Consultar abiblioteca string e a seccao “string” para mais pormenores.

5.1.3. Conversoes

As seguintes funcoes sao funcoes de conversao:

# i n t o f c h a r ; ;: char → i n t = <fun>

# i n t o f s t r i n g ; ;: s t r i n g → i n t = <fun>

# i n t o f f l o a t ; ;: f l o a t → i n t = <fun>

# c h a r o f i n t ; ;: i n t → char = <fun>

# f l o a t o f s t r i n g ; ;: s t r i n g → f l o a t = <fun>

# f l o a t o f i n t ; ;: i n t → f l o a t = <fun>

Por exemplo:

# i n t o f c h a r ’B’ ; ;: i n t = 66

Page 16: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 16 de 43

Retroceder

Ecra Todo

Fechar

Sair

5.1.4. Booleanos

O tipo bool tem os dois elementos habituais true e false.Operadores sobre booleanosnegacao val not : bool →boolconjuncao (e) val (&&) : bool →bool →booldisjuncao (ou) val (||) : bool →bool →bool

Operadores de comparacao= val (=) : ’a →’a →bool6= val (<>) : ’a →’a →bool≤ val (<=) : ’a →’a →bool< val (<) : ’a →’a →bool≥ val (>=) : ’a →’a →bool> val (>) : ’a →’a →bool

5.1.5. Tipo unidade

Existe um tipo particular, chamado em OCaml unit que so possui um elemento:().

# ( ) ; ;: un i t = ( )

Este tipo e particularmente importante quando se trata de escrever funcoescom efeitos colaterais. Aı o tipo unit e o valor () tem o papel do void do C

Page 17: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 17 de 43

Retroceder

Ecra Todo

Fechar

Sair

5.1.6. Linguagens fortemente tipificadas e Polimorfismo

Antes de passar aos tipos de base seguintes e as construcoes de tipo que OCamlfornece, e importante voltar a frisar que OCaml e uma linguagem fortementetipificada com tipos polimorficos.

Que significa tal afirmacao? A primeira parte indica que qualquer valorOCaml tem necessariamente um tipo e que OCaml sancionara qualquer falhaa essa regra (com um erro na compilacao ou na interpretacao). Uma pro-priedade interessante do OCaml e a sua capacidade em adivinhar (o termoexacto e inferir) o tipo de cada valor. Nao necessitamos entao de fornecer ex-plicitamente em cada valor o tipo ao qual ele pertence. OCaml faz isso por nos.O que teremos de cuidar e escrever funcoes (mais genericamente expressoes,valores) que respeitam essa classificacao em tipo. OCaml rejeitara qualquerdefinicao, por exemplo, em que e dada um real a uma funcao esperando uminteiro, mesmo se esse real e 1.0!! Realcemos que, embora pareca falta deflexibilidade, esta caracterıstica, comum a muitas as linguagens modernas quese preocupam com programacao fiavel e robusta, e considerada importante edesejavel.

A segunda parte, o polimorfismo, diz respeito a capacidade de uma funcaode funcionar para elementos de varios tipos que tem uma estrutura em comum.Por exemplo, vectores de inteiros e vectores de reais sao sequencias de acessodirecto que so diferem nos valores que essas sequencias contem. De facto, estainformacao pouco importa a funcao comprimento que devolve o comprimentodum vector. O calculo deste valor pode perfeitamente se abstrair do tipo doselementos. Podemos neste caso considerar o tipo dos valores do vector comouma incognita, uma variavel (de tipo). A nossa funcao comprimento tem assim

Page 18: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 18 de 43

Retroceder

Ecra Todo

Fechar

Sair

varias formas, conforme o tipo de vector ao qual e aplicada. Pode adquirira forma ou ainda especializar-se numa funcao que calcula comprimentos devectores de inteiros, ou ainda pode adquirir a forma, de uma funcao quecalcula comprimentos de vectores de caracteres.

Uma linguagem que permite tal abstraccao e chamada polimorfica(etimologia: que tem varias formas). OCaml e uma tal linguagem.

O polimorfismo surge nos tipos OCaml da seguinte forma:Um tipo e polimorfico quando a sua definicao contempla variaveis,

chamadas variaveis de tipo, que podem ser, quando conveniente, instanciadaspor outros tipos. As variaveis de tipo sao assinaladas por identificadores pre-fixados por uma plica. Por exemplo ’a T denota o tipo OCaml T polimorficonuma variavel ’a.

Exemplos de instancias sao int T char T (int T) T ou mesmo (’a T) T.Nestes casos ’a foi instanciado (tomou o valor) respectivamente por int, char,( int T) e (’a T)

Listas, tuplos, vectores, referencias sao exemplos de tipos polimorficos quedescrevemos neste documento.

5.1.7. Produto Cartesiano, tuplos

O conjunto A1×A2× . . .×An e representado em OCaml por A1∗A2∗A3∗...∗An.Os elementos sao representados por (a1,a2,a3 ,..., an).

No caso de pares (de tipo, por exemplo, A1∗A2) dispomos das funcoes deprojeccao fst e snd

# f s t ; ;: ’ a ∗ ’ b → ’ a = <fun>

Page 19: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 19 de 43

Retroceder

Ecra Todo

Fechar

Sair

# snd ; ;: ’ a ∗ ’ b → ’ b = <fun>

# f s t ( ”octobre ” , 12 ) ; ;: s t r i n g = ”octobre ”

# snd ( ”octobre ” , 12 ) ; ;: i n t = 12

# ( 65 , ’B’ , ” a s c i i ” ) ; ;: i n t ∗ char ∗ s t r i n g = 65 , ’B’ , ” a s c i i ”

5.1.8. Listas

As listas sao coleccoes polimorficas e de acesso sequencial de elementos. Umalista pode conter elementos de qualquer tipo, a restricao e que todos os el-ementos contidos tem de ser do mesmo tipo. Podemos ter assim listas deinteiros, listas de caracteres. O tipo polimorfico OCaml correspondente e’a list . Assim o tipo das listas de inteiro e int list .

Page 20: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 20 de 43

Retroceder

Ecra Todo

Fechar

Sair

valores e operadores sobre listaslista vazia []construtor de listas ::concatenacao de listas @listas por extensao [ 1 ; 2 ; 3 ] ou 1 :: 2 :: 3 :: []comprimento val length : ’a list →intcabeca duma lista val hd : ’a list →’alista sem a cabeca & val tl : ’a list →’a listn-esimo elemento val nth : ’a list →int →’ainversao de lista val rev : ’a list →’a listpertence val mem : ’a →’a list →boolaplicacao de uma funcao sobre elementosduma listamap f [a1; ...; an] = [ f a1; ...; f an] val map : (’a →’b) →’a list →’b listfold left f a [b1 ;...; bn] =f (...( f ( f a b1) b2 )...) bn val fold left : (’a →’b →’a) →’a →’b list →’afor all p [a1; ...; an] =(p a1) && (p a2) && ... && (p an) val for all : (’a →bool) →’a list →boolexists p [a1; ...; an]=(p a1) || (p a2) || ... || (p an) val exists : (’a →bool) →’a list →boolfiltragem, filter p [a1; ...; an]=a lista de todos os elementos verificando p val filter : (’a →bool) →’a list →’a listordenacao val sort : (’a →’a →int) →’a list →’a list

Consultar a biblioteca list para mais pormenores.

5.2. Estruturas Condicionais

Sem surpresas, o se entao senao e if then else em OCaml.

Page 21: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 21 de 43

Retroceder

Ecra Todo

Fechar

Sair

Sintaxe:if expressao1 then expressao2 else expressao3.Restricao: expressao2 e expressao3 tem necessariamente o mesmo tipo.O else e obrigatorio. Se for omitido e entao acrescentado implicitamente

else () (significado: senao nao fazer nada). Neste caso a expressao do then deser tambem do tipo unit.

5.3. Declaracao de valores

5.3.1. Declaracoes globais

Sintaxe:let nome = expressao;;

5.3.2. Declaracoes locais

Sintaxe:let nome = expressao1 in expressao2 ;;Ao contrario da declaracao global, o identificador nome so vai, neste caso,

ser conhecido (e com o valor expressao1) dentro de expressao2.Existe a possibilidade de declaracoes anonimas. Tais sao uteis quando so

o valor computado na parte direita do igual interessa:Sintaxe:let = expressao;; ou let = expressao1 in expressao2 ;;Ambas as declaracoes locais e globais tem variantes, consultar as referen-

cias para mais pormenores

Page 22: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 22 de 43

Retroceder

Ecra Todo

Fechar

Sair

5.4. Expressoes funcionais e funcoes

5.4.1. Declaracao de base

Sintaxe:function p →expressaoneste caso a funcao contemplada e unaria (um so parametro). Para funcoes

binarias (por exemplo) sera preciso usar a sintaxe:function p →function q →expressao

5.4.2. Sintaxe alternativa para funcoes n-arias

Por razoes de conveniencia e possıvel utilizar a sintaxe seguinte:fun p1 p2 ... pn →expressaopara as funcoes n-arias.

5.4.3. Declaracoes de valores funcionais

Tal como qualquer valor, e possıvel declarar nomes para funcoes.Sintaxes:let nome = function p →expressaoou aindalet nome = fun p1 p2 ... pn →expressaoou aindalet nome p1 p2 ... pn = expressaoNo caso de uma funcao recursiva a sintaxe e:let rec nome p1 p2 ... pn = expressao

Page 23: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 23 de 43

Retroceder

Ecra Todo

Fechar

Sair

5.4.4. Fecho

Em Ocaml as funcoes sao fechadas. Isto e, todas as variaveis contidas nadefinicao e que nao sao parametros sao avaliadas e substituıdas pelos valores.Por exemplo:

# let m = 3 ; ;val m : in t = 3# let f= ( function x → x + m) ; ;val f : i n t → i n t = <fun># f 5 ; ;

: i n t = 8# let m = 8 ; ;val m : in t = 8# f 5 ; ;

: i n t = 8

5.5. Declaracao de tipos e filtragem de motivos

5.5.1. Pattern matching (filtragem)

Sintaxe:

match expr with| p1 → expr1...| pn → expr

Significa: olhar para o valor de expr, se este valor e assemelha com p1 entaoavaliar expr1 senao verificar semelhanca com p2, etc...

Page 24: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 24 de 43

Retroceder

Ecra Todo

Fechar

Sair

Restricoes:

• os motivos p1 ... pn tem de cobrir todos os casos;

• os motivos tem de ser lineares. Isto e, se conterem variaveis, entao essasso ocorrem uma unica vez.

Motivo universal (que se assemelha sempre): . O motivo significa “out-ros casos” ou ainda “tudo”. A construcao let pode ser vista como um casoparticular de filtragem quando existe uma so possibilidade de concordancia.

Quando dois motivos cobrem o mesmo caso, e entao escolhido o motivoque aparece primeiro.

Existem extensoes ao pattern matching, para conhece-las consultar a bib-liografia.

Exemplos de filtragem:

# let rec f o l d l e f t f a l =match l with

[ ] → a| cabeca : : r e s t o → f o l d l e f t f ( f a cabeca ) r e s t o ; ;

val f o l d l e f t : ( ’ a → ’ b → ’ a ) → ’ a → ’ b l i s t → ’ a = <fun># f o l d l e f t (+) 0 [ 8 ; 4 ; 1 0 ] ; ;

: i n t = 22# let vaz io l =

match l with[ ] → true

| → fa l se ; ;val vaz io : ’ a l i s t → bool = <fun>

# vaz io [ 1 ; 2 ; 3 ] ; ;: boo l = fa l se

Page 25: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 25 de 43

Retroceder

Ecra Todo

Fechar

Sair

# let soma par c =l et ( esq , d i r ) = c in

esq+d i r ; ;val soma par : i n t ∗ i n t → i n t = <fun>

# soma par ( 1 , 2 ) ; ;: i n t = 3

5.5.2. Declaracao de tipos

E possıvel extender os tipos de base com tipos definidos pelo programador.Sintaxe:

type nome = de f i n i c a o d o t i p o ; ;

No caso de tipos mutuamente recursivos (que dependem mutuamente entreeles) a sintaxe e extendida em:

type nome1 = de f i n i c a o do t i p o 1and nome2 = de f i n i c a o do t i p o 2...

and nome n = de f i n i c a o do t i p o n ; ;

No caso dos tipos serem polimorficos, e necessario indicar as variaveis detipo.

Sintaxe:

type ( ’ a1 , . . . , ’ an ) nome = de f i n i c a o d o t i p o ; ;

Obviamente, podemos definir tipos polimorficos mutuamente dependentes.

Page 26: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 26 de 43

Retroceder

Ecra Todo

Fechar

Sair

Quais sao as possibilidades para definicao do tipo? composicao de tipos debase (como por exemplo pares de listas de inteiros, etc...), registos, tipos soma.

Exemplos:

# type ’ param pa r i n t e i r o = in t ∗ ’ param ; ;type ’ a p a r i n t e i r o = in t ∗ ’ a# type par to ta lmente in s tanc i ado = f l o a t p a r i n t e i r o ; ;type par to ta lmente in s tanc i ado = f l o a t p a r i n t e i r o# let ( x : pa r to ta lmente in s tanc i ado ) = (3 , 3 . 14 ) ; ;val x : pa r to ta lmente in s tanc i ado = 3 , 3 .14

5.5.3. Registos

Sintaxe:

type ( ’ a1 , . . . , ’ an ) nome ={ nome campo1 : t ipo1 ; . . . ; nome campo n : t ipo n } ; ;

Um exemplo:

# type complex = { re : f l o a t ; im : f l o a t } ; ;type complex = { re : f l o a t ; im : f l o a t }

5.5.3.1. Criacao de registos Sintaxe:

{ nome campo1 = va lo r1 ; . . . ; nome campo n = va lo r n } ; ;

Nao e necessario listar os campos na ordem da definicao,mas e preciso quetodos la estejam.

# let c = { re =2;im=3} ; ;val c : complex = { re =2; im=3}

Page 27: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 27 de 43

Retroceder

Ecra Todo

Fechar

Sair

# c = {im=3. ; re =2.} ; ;: boo l = true

5.5.3.2. Acesso aos campos Sintaxe:

expr . nome campo

Consulte a bibliografia para mais pormenores.

5.5.4. Tipos soma

Sintaxe:

type nome tipo =| Nome constructor1 of t11 ∗ . . . ∗ t1k ....| Nome constructorn of tn1 ∗ . . . ∗ tnk

Os identificadores de construtores comecam sempre por uma maiuscula.A parte of t1 ∗ ...∗ tk na declaracao dum construtor nao e obrigatoria. So erequerida se o construtor tiver argumentos.

Exemplos de tipo soma:

# type ( ’ a , ’b ) l i s t 2 =Ni l

| Acons of ’ a ∗ ( ’ a , ’b ) l i s t 2| Bcons of ’ b ∗ ( ’ a , ’b ) l i s t 2 ; ;

# type semana =Domingo | Segunda | Terca | Quarta | Quinta | Sexta | Sabado ; ;

Page 28: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 28 de 43

Retroceder

Ecra Todo

Fechar

Sair

# type t a r e f a s =Chemistry | Companhia | Trabalho de Casa| Armazem | Faculdade da Cerveja ; ;

# type ac t i v i dade =Trabalho of t a r e f a | Compras | Descanco ; ;

e exemplos de funcao com filtragem sobre elementos de tipos soma

# let rec ext rac t odd l =match l with

Ni l → [ ]| Acons ( , x ) → ext rac t odd x| Bcons (n , x ) → n : : ( ext rac t odd x ) ; ;

val ext rac t odd : ( ’ a , ’b ) l i s t 2 → ’ b l i s t = <fun># let que f a co ho j e d ia =

match dia withSegunda→ Trabalho Faculdade da Cerveja

| Terca → Trabalho Companhia| Quarta → Trabalho Chemistry| Quinta → Trabalho Trabalho de Casa| Sexta → Trabalho Armazem| Sabado → Compras| Domingo→ Descanco ; ;

val que f a co ho j e : semana → ac t i v i dade = <fun># que f a co ho j e Quinta ; ;

: a c t i v i dade = Trabalho Trabalho de Casa

Page 29: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 29 de 43

Retroceder

Ecra Todo

Fechar

Sair

5.6. Excepcoes

5.6.1. Definicao

Sintaxe:

exception Nome of parametros ; ;

Regras:

• os identificadores de excepcoes sao de facto construtores, logo devemcomecar por uma maiuscula;

• o polimorfismo nao e aceite nas excepcoes.

# exception MINHA EXCEPCAO; ;exception MINHA EXCEPCAO# MINHA EXCEPCAO; ;

: exn = MINHA EXCEPCAO# exception Depth of i n t ; ;exception Depth of i n t# Depth 4 ; ;

: exn = Depth (4 )

5.6.2. Lancar uma excepcao

Sintaxe:

r a i s e (Nome t1 . . . tn )

Exemplos:

Page 30: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 30 de 43

Retroceder

Ecra Todo

Fechar

Sair

# r a i s e ; ;: exn → ’ a = <fun>

# r a i s e MINHA EXCEPCAO; ;Uncaught exception : MINHA EXCEPCAO# 1+( r a i s e MINHA EXCEPCAO) ; ;Uncaught exception : MINHA EXCEPCAO# r a i s e (Depth 4 ) ; ;Uncaught exception : Depth (4 )

5.6.3. Recuperar excepcoes

Sintaxe:

try expres sao with| motivo excepcao1 → expr1...| motivo excepcao n → expr n

No caso da avaliacao de expressao levantar uma excepcao entao ha filtragemcom os diferentes motivos listados. no caso de haver concordancia a expressaocorrespondente e avaliada.

Exemplos:

# exception Found zero ; ;exception Found zero# let rec mult rec l = match l with

[ ] → 1| 0 : : → r a i s e Found zero| n : : x → n ∗ ( mult rec x ) ; ;

Page 31: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 31 de 43

Retroceder

Ecra Todo

Fechar

Sair

val mult rec : i n t l i s t → i n t = <fun># let mu l t l i s t l =

try mult rec l with Found zero → 0 ; ;val mu l t l i s t : i n t l i s t → i n t = <fun># mu l t l i s t [ 1 ; 2 ; 3 ; 0 ; 5 ; 6 ] ; ;

: i n t = 0

Page 32: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 32 de 43

Retroceder

Ecra Todo

Fechar

Sair

6. Programacao imperativa

6.1. Estruturas de Dados modificaveis

6.1.1. Vectores

Os vectores em OCaml tem por delimitadores os sımbolos [| e |] .Exemplo:

# let v = [ | 3 . 1 4 ; 6 . 2 8 ; 9 .42 | ] ; ;val v : f l o a t array = [ | 3 . 1 4 ; 6 . 2 8 ; 9 . 4 2 | ]

6.1.1.1. Acesso Sintaxe:

expr1 . ( expr2 )

6.1.1.2. Atribuicao Sintaxe:

expr1 . ( expr2 ) < expr3

Exemplos:

# v . ( 1 ) ; ;: f l o a t = 6 .28

# v . ( 0 ) < 100 .0 ; ;: un i t = ( )

# v ; ;: f l o a t array = [ | 1 0 0 ; 3 . 1 4 ; 9 . 4 2 | ]

# let t = [ |[ | 1 | ] ;[ | 1 ; 1 | ] ;

Page 33: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 33 de 43

Retroceder

Ecra Todo

Fechar

Sair

[ | 1 ; 2 ; 1 | ] ;[ | 1 ; 3 ; 3 ; 1 | ] ;[ | 1 ; 4 ; 6 ; 4 ; 1 | ] ;[ | 1 ; 5 ; 10 ; 10 ; 5 ; 1 | ]

| ] ; ;val t : i n t array array =

[ | [ | 1 | ] ; [ | 1 ; 1 | ] ; [ | 1 ; 2 ; 1 | ] ; [ | 1 ; 3 ; 3 ; 1 | ] ;[ | 1 ; 4 ; 6 ; 4 ; . . . | ] ; . . . | ]

# t . ( 3 ) ; ;: i n t array = [ | 1 ; 3 ; 3 ; 1 | ]

Operadores usuais sobre vectoresComprimento val length : ’a array →intcriacao val make : int →’a →’a arraymake n x = [|x; ...( n vezes )... ;x |]

inicializacao val init : int →(int →’a) →’a arrayinit n f = [| f 1; ... ; f n |]

concatenacao de vectores val append : ’a array →’a array →’a arrayduplicacao de vectores val copy : ’a array →’a arrayConversoes de/para listas val to list : ’a array →’a list

val of list : ’a list →’a arraymap para vectores val map : (’a →’b) →’a array →’b arrayfold left para vectores val fold left :

(’a →’b →’a) →’a →’b array →’aordenacao val sort : (’a →’a →int) →’a array →unit

Consultar a biblioteca array para mais pormenores.

6.1.2. Strings como vectores

6.1.2.1. Acesso directo Sintaxe: expr1 . [expr2]

Page 34: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 34 de 43

Retroceder

Ecra Todo

Fechar

Sair

6.1.2.2. Atribuicao Sintaxe: expr1 . [expr2] < expr3Exemplos

# let s = ”Ola Tudo Bem? ” ; ;val s : s t r i n g = ”Ola Tudo Bem? ”# s . [ 2 ] ; ;

: char = ’a ’# s . [ 2 ] < ’ Z ’ ; ;

: un i t = ( )# s ; ;

: s t r i n g = ”OlZ Tudo Bem? ”

6.1.3. Registos e Campos modificaveis

O OCaml permite que campos de registos possam ser modificaveis. Para tal epreciso que os referidos campos sejam declarados com a palavra chave mutable.

6.1.3.1. Declaracao Sintaxe: type nom = { ...; mutable nome campo i : t ; ...}

6.1.3.2. Atribuicao Sintaxe: expr1 . nom < expr2Exemplos:

# type ponto = { mutable xc : f l o a t ; mutable yc : f l o a t } ; ;type ponto = { mutable xc : f l o a t ; mutable yc : f l o a t }# let p = { xc = 1 . 0 ; yc = 0 .0 } ; ;val p : ponto = {xc=1; yc=0}# p . xc < 3 .0 ; ;

: un i t = ( )# p ; ;

: ponto = {xc=3; yc=0}

Page 35: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 35 de 43

Retroceder

Ecra Todo

Fechar

Sair

# let moveto p dx dy =l et ( ) = p . xc < p . xc +. dxin p . yc < p . yc +. dy ; ;

val moveto : ponto → f l o a t → f l o a t → uni t = <fun># moveto p 1 .1 2 .2 ; ;

: un i t = ( )# p ; ;

: ponto = {xc =4.1 ; yc=2.2}

6.1.4. Referencias

O conceito de variaveis OCaml difere do conceito de variaveis de linguagenss como o C. De facto assemelham-se do conceito de variaveis em matematica:uma variavel, um valor.

Existe no entanto a possibilidade de ter variaveis como em C. Devem servariaveis do tipo ref.

type ’ a ref = {mutable contents : ’ a}

6.1.4.2. Declaracao Sintaxe: ref expr

6.1.4.3. Acesso Sintaxe: !nome

6.1.4.4. Atribuicao Sintaxe: nome:= exprExemplos:

Page 36: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 36 de 43

Retroceder

Ecra Todo

Fechar

Sair

# let x = ref 3 ; ;val x : i n t ref = { contents=3}# x ; ;

: i n t ref = { contents=3}# ! x ; ;

: i n t = 3# x := 4 ; ;

: un i t = ( )# ! x ; ;

: i n t = 4# x := ! x+1 ; ;

: un i t = ( )# ! x ; ;

: i n t = 5

6.1.4.5. Fecho, referencias e funcoes E possıvel tirar proveito do fenomeno defecho para obter funcoes que partilham e manipulam valores escondidos aoutilizador. A ideia e declarar tais funcoes e as variaveis por esconder simul-taneamente.

Eis um exemplo:

# let ( i n i c i a l i z a , a f ec ta , incrementa , mostra ) =l et va l o r po r e s conde r : i n t ref =

ref 0 inlet e l t i n i t ( ) =va l o r po r e s conde r := 0 in

let e l t g e t ( ) =! va l o r po r e s conde r in

let e l t i n c r ( ) =va l o r po r e s conde r := 1+ ! va l o r po r e s conde r in

Page 37: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 37 de 43

Retroceder

Ecra Todo

Fechar

Sair

l et e l t s e t n =va l o r po r e s conde r := n in

( e l t i n i t , e l t s e t , e l t i n c r , e l t g e t ) ; ;val i n i c i a l i z a : un i t → uni t = <fun>val a f e c t a : i n t → uni t = <fun>val incrementa : un i t → uni t = <fun>val mostra : un i t → i n t = <fun># i n i c i a l i z a ( ) ; ;

: un i t = ( )# mostra ( ) ; ;

: i n t = 0# incrementa ( ) ; ;

: un i t = ( )# mostra ( ) ; ;

: i n t = 1# a f e c t a 5 ; ;

: un i t = ( )# mostra ( ) ; ;

: i n t = 5# va l o r po r e s conde r ; ;Unbound value va l o r po r e s conde r

6.2. Entradas e saıdas

As entradas e saıdas, de forma geral, sao efectuadas por funcoes que naocalculam nenhum valor em particular mas que efectuam efeitos colaterais.Assim uma funcao de entradas e saıdas devolvera habitualmente um elementodo tipo unit.

As entradas e saıdas em OCaml sao geridas a custa de canais de comuni-

Page 38: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 38 de 43

Retroceder

Ecra Todo

Fechar

Sair

cacao. Existem dois tipos predefinidos de canais: o tipo dos canais de entradain channel e o tipo dos canais de saıda out channel. Quando o fim de ficheiro eatingido a excepcao End of file e lancada. Existem tres canais predefinidos, asemelhanca do C: stdin, stdout e stderr.

6.2.1. Abertura de ficheiro

# open in ; ;: s t r i n g → i n channe l = <fun>

# open out ; ;: s t r i n g → out channe l = <fun>

6.2.2. Fecho de ficheiro

# c l o s e i n ; ;: i n channe l → uni t = <fun>

# c l o s e ou t ; ;: out channe l → uni t = <fun>

6.2.3. Leitura e Escrita

Eis algumas funcoes de leitura e escrita em canais abertos:

# i n pu t l i n e ; ;: i n channe l → s t r i n g = <fun>

# input ; ;: i n channe l → s t r i n g → i n t → i n t → i n t = <fun>

# output ; ;: out channe l → s t r i n g → i n t → i n t → uni t = <fun>

# r e a d l i n e ; ;: un i t → s t r i n g = <fun>

Page 39: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 39 de 43

Retroceder

Ecra Todo

Fechar

Sair

# p r i n t s t r i n g ; ;: s t r i n g → uni t = <fun>

# pr in t new l i n e ; ;: un i t → uni t = <fun>

Exemplo:

# let ( ) = p r i n t s t r i n g ”um, ” inlet ( ) = p r i n t s t r i n g ” dois , ” inlet ( ) = p r i n t s t r i n g ” e t r e s ” inlet ( ) = p r i n t s t r i n g ” zero ” inpr in t new l i n e ( ) ; ;

um, do i s e t r e s zero: un i t = ( )

6.3. Estruturas de controlo

6.3.1. Sequencia

E possıvel pedir ao OCaml que uma lista de expressoes sejam avaliados se-quencialmente, tal como aconteceria em C. Tal sequencia segue o seguinteformato: expr1;expr2; ...; expr n

O valor da sequencia e o valor da ultima expressao (neste caso expr n). Otipo das expressoes expr1;expr2 ;...; expr (n 1) deve ser unit. Se tal nao for o caso,uma mensagem de aviso (Warning) e mostrada. A funcao val ignore: ’a →unitpermite remediar este problema.

Exemplos:

# p r i n t i n t 1 ; 2 ; 3 ; ;Characters 1 4 1 5 :

Page 40: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 40 de 43

Retroceder

Ecra Todo

Fechar

Sair

Warning : t h i s exp r e s s i on should have type uni t .1 : i n t = 3# p r i n t i n t 1 ; i gno r e 2 ; 3 ; ;1 : i n t = 3# p r i n t s t r i n g ( ”1+1 = ”ˆ s t r i n g o f i n t (1+1)) ; p r i n t new l i n e ( ) ; 4+1 ; ;1+1 = 2

: i n t = 5

6.3.2. Blocos de programa

Para delimitar grupos de expressoes podemos utilizar alternativamente as con-strucoes seguintes:

( expr )

ou

begin expr end

6.3.3. Ciclos

Sintaxe:

for nome = expr1 to expr2 do expr3 donefor nome = expr1 downto expr2 do expr3 donewhile expr1 do expr2 done

Exemplos:

# let rec emais emenos n =p r i n t s t r i n g ”Introduza um numero : ” ;l et i = r e ad in t ( ) in

Page 41: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 41 de 43

Retroceder

Ecra Todo

Fechar

Sair

i f i = n then p r i n t s t r i n g ”BRAVO\n\n”else

begini f i < n

then p r i n t s t r i n g ”E+\n” else p r i n t s t r i n g ”E \ n” ;emais emenos n

end ; ;val emais emenos : i n t → uni t = <fun># for i =10 downto 1 do

p r i n t i n t i ; p r i n t s t r i n g ” ”done ;p r i n t new l i n e ( ) ; ;

10 9 8 7 6 5 4 3 2 1: un i t = ( )

# let r = ref 1in while ! r < 11 do

p r i n t i n t ! r ;p r i n t s t r i n g ” ” ;r := ! r+1

done ; ;1 2 3 4 5 6 7 8 9 10 : un i t = ( )

Page 42: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 42 de 43

Retroceder

Ecra Todo

Fechar

Sair

7. Modulos

TO DO!

Page 43: Introdu¸c˜ao `a Programac˜ao Funcional em OCamldesousa/2011-2012/TComp/apresentacao-ocaml.pdf · e a industria aeronautica (Dassault,...). 3.1. Heran¸ca ML A linguagem OCaml,

Aviso Previo

Bibliografia

Introducao

Compilacao, . . .

Nucleo funcional

Programacao . . .

Pagina Pessoal

Pagina de Rosto

JJ II

J I

Pagina 43 de 43

Retroceder

Ecra Todo

Fechar

Sair

References

[1] D. Bagley. The great computer language shootout.http://www.bagley.org/~doug/shootout

[2] E. Chailloux, P. Manoury, and B. Pagano. Developing applications withobjective caml. http://caml.inria.fr/oreilly-book, 2003.

[3] G. Cousineau and M. Mauny. The functional approach to programming.Cambridge University Press, 1998.

[4] L. Pequet. Programmation fonctionelle - introduction illustree en objectivecaml. http://www-rocq.inria.fr/~pecquet/pro/teach/teach.html,2002.

[5] D. Remy. Understanding, and Unraveling the OCaml Lan-guage, volume LNCS 2395 of Applied Semantics. AdvancedLectures, chapter ?, pages 413–537. Springer-Verlag, 2002.http://pauillac.inria.fr/~remy/cours/appsem/ocaml.pdf

[6] OCaml Development Team. The Objective Camlsystem:Documentation and user’s manual, 2002.http://caml.inria.fr/ocaml/htmlman/index.html