Buscar

Aula_07_-_Linguagem_Funcional


Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 35 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 35 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 35 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Continue navegando


Prévia do material em texto

Clique para editar o estilo do título mestre
Clique para editar o estilo do subtítulo mestre
*
*
*
Cap 04 - Linguagem Funcional
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Linguagem Funcional
Principal conceito de programação: a abordagem das estruturas de dados (“objetos”) do programa fonte como funções matemáticas.
As funções podem ser: passadas como argumentos; retornadas como resultado; guardadas como valores de variáveis; definidas recursivamente; utilizadas como veículos de modularização.
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Programação funcional
A programação funcional é um estilo - paradigma - de programação que
 enfatiza a avaliação de expressões
 não utiliza comandos e algoritmos (seqüência de comandos)
não utiliza variáveis e atribuições (transparência referencial) 
exige bastante disciplina de programação
produz programas que podem ser mais facilmente verificados
Uma notação para se ler, escrever e executar computações.
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
LPF -Linguagens de Programação Funcionais
Objetivo: assemelhar-se ao máximo possível a funções matemáticas
Em uma LPF, a avaliação de uma função sempre produz o mesmo resultado a partir dos mesmos parâmetros
independente de contexto e execuções anteriores
transparência referencial: não existe o conceito de referência a variável
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Linguagens imperativas: baseadas em alterações de variáveis
	Ex: f := (x + y) / (a - b) 		Variáveis
						x, y, a, b, f
						
Linguagens funcionais: não utilizam variáveis e comandos de atribuição
É feita uma associação nome  valor e não uma atribuição
A cada associação, um novo identificador é criado (sem relação com outros de mesmo nome)
Exemplo ML: variáveis são similares a constantes em PASCAL
 val x = 17		val x = 17 : int
 val x = true		val x = true : bool
 val z = x		val z = true : bool
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Fundamentos de LPF : computações
O processo básico de computação de uma LPF é fundamentalmente diferente de uma LPI
em uma LPI as operações consistem de transformações sobre valores armazenados em variáveis (atribuição)
em uma LPI, o controle de variáveis e seus valores é uma preocupação constante e fonte de complexidade (depuração)
em uma LPF, assim como em matemática, variáveis não são necessárias (somente valores e resultados)
em uma LPF não existem comandos de controle de fluxo de execução
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Abstração de função
Exemplo em Pascal
function pot (x:real;n:integer): real;
 begin (* supor n>0 *)
 if n=1	then 
 pot := x
 else 
	 pot := x * pot(x, n-1) 
end;
Exemplo em ML
fun pot (x:real, n:int) =
	if n = 1 then x
	else x * pot(x, n-1);
Simples e concisa
Nome da função: significado único 
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Imperativo x Funcional: resumo
Modelo imperativo
Projeto baseado diretamente na arquitetura de von Neumann
células de memória
seqüência de execução de ações
Preocupação com eficiência
Linguagens de uso geral, sem preocupação com desenvolvimento de software em domínios específicos
Modelo Funcional
Projeto baseado em funções matemáticas
Forte embasamento teórico
cálculo Lambda
Existe preocupação com eficiência de execução 
forma de avaliação tardia
paralelismo
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Imperativo x Funcional: resumo
Modelo imperativo
programa: seqüência de comandos que transformam variáveis
base: variáveis, comandos, procedures
execução: conceito de seqüência
variáveis: mudanças de estado, alteração por atribuição
estado: implícito, modificado por atribuições
componentes de primeira classe: variáveis
Modelo Funcional
programa: é uma função composta por funções mais simples
base: expressões, funções
execução: baseada em recursividade
nomes identificam valores permanentes (const), transparência referencial 
estado: explícito, modificado por funções
componentes de primeira classe: funções
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Sobre ML
ML denomina uma família de linguagens de programação funcionais : ML, SML, SML/NJ, CAML, EML, e outras
http://www.cl.cam.ac.uk/users/lcp/MLbook/general.html
O nome ML provém originalmente de Meta-Language
Padronizada como SML em 1990, revisada em 1997: SML'97 
ML é uma linguagem declarativa e não uma linguagem procedural
A ausência da semântica de VonNeumann torna as linguagens funcionais desafiadoras para programadores
Programas funcionais são muito mais adequados para análise formal e provas de correção
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
ML: arquivos e bibliotecas
ML oferece suporte para arquivos e entrada saída em redes
Todos os sistemas SML compartilham uma mesma biblioteca de funções e módulos: a SML Basis Library. 
A biblioteca básica fornece várias formas de tratamento de dados, E/S, e funções de interface com SO
Possui um sofisticado sistema de tipos, incluindo tipos genéricos e oferece suporte a polimorfismo
A implementação para a plataforma .NET oferece interoperabilidade com programas escritos em outras linguagens de programação e compartilhamento de bibliotecas 
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
ML: mais características
ML é uma linguagem funcional pura, no sentido de:
não é permitido atribuição à memória
o programador declara funções e faz referência a valores
Oferece o suporte para:
recursividade, tipagem forte, com inferência de tipos
variedade de tipos de dados
facilidades para construir agregados e tipos funcionais
vinculação tardia, composição de funções, tratamento de exceções
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Função fatorial: ML
(* Exemplo de função fatorial: ML *)
fun fat n = if n=0 then 1 else n* fat(n-1)
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Programação em ML
Núcleo básico
Tipos primitivos
Operações
Formas funcionais: como definir e usar funções
Definição de novos tipos de dados
Biblioteca de funções básicas e em unidades. Avaliar: help “lib”;
Módulos
Mecanismos para estruturar programas em unidades
Exemplo: signature REGEXP = sig ............ end 
Mecanismos de herança: inclusão e especialização
Unidades (Units): podem ser carregadas em uma sessão interativa por: load "U"; sendo U o nome da unidade
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
ML x Tipos
ML é uma linguagem fortemente tipada
 Cada expressão possui um tipo, determinado pelo compilador
 Não é feita conversão implícita de tipos
- 3.0 + 2.0;			 > 5.0 : real
- 3.0 + 2; 
> Type clash: expression of type int cannot have type real
Conversão explícita		
- (3.0 + 2.0) = real (3 + 2)	 	> true : bool 	
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Tipos básicos de ML: simples
Os tipos primitivos disponíveis são: inteiros (int), reais (real), lógicos (bool) e strings (string). 
Os operadores aritméticos são os usualmente encontrados em linguagens de programação: +, -, *, /, div e mod. 
Os operadores relacionais são representados por: >, >=, <, <=, = e <>
Exemplos
- 5 + 3 div 2; > val it = 6 : int
- "torta"; > val it = "torta" : string
- #"A"; > val it = #"A" : char
- true; > val it = true : bool
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG*
*
*
Tipos básicos de ML: compostos
Os tipos compostos são representados por tuplas, com elementos entre ( ), listas, com elementos entre [ ] e registros, com elementos entre { } 
Listas são formadas por elementos de mesmo tipo, enquanto que tuplas e registros admitem componentes de diferentes tipos
Exemplos
- (2,"Maria"); > val it = (2, "Maria") : int * string
- (true, 4.55, "s"); > val it = (true, 4.55, "s") : bool * real * string
- (("gato",3), false); > val it = (("gato", 3), false) : (string * int) * bool
- [1,2,3]; > val it = [1, 2, 3] : int list
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Módulos: bibliotecas
Os tipos primitivos podem ser usados sem qualificação e são associados a um conjunto de operações básicas e funções
Outras funções e outros tipos (como String, Date) são definidos em bibliotecas, com suas próprias operações
Exemplo
- load "Math"; > val it = ( ) : unit
- Math.pi; > val it = 3.14159265359 : real
- Math.sqrt(2.0); > val it = 1.41421356237 : real
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Associações (bindings)
Associações de valores
Associações de nomes
- val y=(10,"gato");
> val y = (10, "gato") : int * string
- val (prim,seg)=y;
> val prim = 10 : int
 val seg = "gato" : string
- val bb=true orelse false;
> val bb = true : bool
- val cc= bb andalso true;
- val pi=Math.pi;
> val pi = 3.14159265359 : real
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Funções
Definição de função
inferência de tipo
Assinatura de função
interpretador fornece
Utilização de função
transparência referencial
- fun inc n=n+1; > val inc = fn : int -> int
- fun incr n= n+ 1.0; > val incr = fn : real -> real
- val n=10; > val n = 10 : int
- inc n; > val it = 11 : int
- n; > val it = 10 : int
- size; > val it = fn : string -> int
- inc (trunc(incr 20.0));> val it = 22 : int
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Funções e parâmetros
Todas as funções são aplicadas sobre um único argumento: tipo de dado simples ou composto, ou uma função 
- fun maior(a,b)=if a>b then a else b;
> val maior = fn : int * int -> int
- maior(3,4);
> val it = 4 : int
- max (maior(3,4)) 5;
> val it = 5 : int
(* diferente assinatura *)
- fun max a b = if a>b then a else b;
> val max = fn : int -> int -> int
- max 3 4;
> val it = 4 : int
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Tuplas como resultado
Tuplas pode ser usadas para retornar valores
- fun devolvedupla(x:int)=(x+10,x+20);
> val devolvedupla = fn : int -> int * int
- devolvedupla 2; 		> val it = (12, 22) : int * int
- val (a, b)= devolvedupla 5; 	> val a = 15 : int val b = 25 : int
- fun compara t1 t2 = t1 = t2; > val ''a compara = fn : ''a -> ''a -> bool
- compara (10, true) (5*2, 3=3); > val it = true : bool
Tuplas e funções booleanas
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Tipos de parâmetro e de resultado
Argumentos com tipo
- fun maior (a:int, b:int) = if a>b then a else b;	
> val maior= fn: int * int -> int
Tipo de resultado
- fun mais (x, y) :int = x + y;	
> val mais: fn : int * int -> int
Inferência de tipos de argumentos e resultado (/)
- fun divider (x, y) = x / y; 
> val divider: fn : real * real -> real
Tipo genérico ´t
- fun qq(a,b)=(a,b);
> val ('a, 'b) qq = fn : 'a * 'b -> 'a * 'b
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Recursividade e parâmetros constantes
Recursividade
Sobrecarga
Outro exemplo 
com recursividade 
dupla
- fun fat n= if n<=1 then 1 else n*fat(n-1);
> val fat = fn : int -> int
- fun fat 0=1| fat 1= 1|fat n = n*fat(n-1);
> val fat = fn : int -> int
- fun fib 0 = 1 | fib 1=1
		 | fib n = fib(n-1) + fib(n-2);
> val fib = fn : int -> int
- fib 20;
> val it = 10946 : int
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Exemplo de simulação do comando Case
val dia = fn 0 => ”Segunda"
 | 1 => ”Terça"
 | 2 => ”Quarta"
 | 3 => ”Quinta"
 | 4 => ”Sexta"
 | 5 => ”Sabado"
 | _ => ”Domingo";
val dia = fn : int -> string
dia 3;
val it = ”Quinta" : string
dia 6;
val it = ”Domingo" : string
dia 7;
val it = ”Domingo" : string
_ denota qualquer valor
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Formas funcionais: mais alta ordem
Uma forma funcional ou função de mais alta ordem é aquela que usa funções como parâmetros ou fornece uma função como resultado, ou ambas
Composição de funções: 
forma funcional que usa duas funções como argumentos e cujo resultado é obtido pela aplicação da primeira função sobre o resultado da segunda função
Notação: h  f  g 
Exemplo: Para f (x)  x * x e g (x)  x + 3, 
h (5)  f ( g ( x)) resulta em 64
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Composição: exemplo em ML
- fun f(x)=x*x;
> val f = fn : int -> int
- fun g(x)=x+3;
> val g = fn : int -> int
- fun h f x = f(g(x));
> val 'a h = fn : (int -> 'a) -> int -> 'a
- h f 5;
> val it = 64 : int
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Formas Funcionais
Construção: forma funcional que usa uma lista de funções como parâmetros e fornece uma lista de resultados obtidos pela aplicação de cada uma das funções a um dado parâmetro. Notação [ f, g]
Exemplo: Para f (x)  x * x * x e g (x)  x + 3, [f, g] (4) resulta em (64, 7)
- fun comp f1 f2 n= (f1 n, f2 n);
> val ('a, 'b, 'c) comp = fn : ('a -> 'b) -> ('a -> 'c) -> 'a -> 'b * 'c
- comp f g 4;
> val it = (64, 7) : int * int
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Formas funcionais:aplicação geral
Aplicação geral (apply-to-all): forma funcional que usa uma única função como parâmetro e fornece uma lista de valores obtidos pela aplicação da função dada a cada elemento da lista de parâmetros. Notação: 
Exemplo: Para h (x)  x * x * x,  ( h, (3, 2, 4)) resulta em (27, 8, 64)
(* exemplo em ML *)
- fun x2 nil=nil | x2(hd::tt) = (hd*2)::(x2 tt);
> val x2 = fn : int list -> int list
- x2[2,3,4];
> val it = [4, 6, 8] : int list
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Escopo de declarações
Escopo usual: uma sessão
Delimitação de escopo: let <decl> in <expr> end
- val m=5.6;
- val m = 5.6 : real
- let val m = 3
 val n = m * m
in
 m * n
end;
> val it = 27 : int
- m;
> val it = 5.6 : real
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Listas e funções
Listas podem ser construídas e retornadas
- fun lista li ls= if li>ls then nil else li::lista (li+1) ls;
> val lista = fn : int -> int -> int list
- lista 2 10;
> val it = [2, 3, 4, 5, 6, 7, 8, 9, 10] : int list
- fun somalista nil = 0 
	| somalista (hd :: tl) = hd + somalista (tl);	
> val somalista = fn: int list -> int
- somalista [ 1, 2, 3];			> val it = 6 : int
Listas podem ser recebidas como argumento
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Listas e Tuplas
Criando uma lista de Tuplas
val romano = [(1000, "M"), (900, "CM"), (500, "D"), (400, "CD"), (100, "C"), (90, "XC"), (50, "L"), (40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I")] 
(* função auxiliar: compara elemento da tupla *)
- fun achei ((a,b), c) = b=c;
> val ('a, ''b) achei = fn : ('a * ''b) * ''b -> bool
- fun busca nil nome = (0,nome) (* tupla *)
 | busca (hd::tl) nome = if achei(hd,nome) 
	then hd (* tupla*)
	else busca tl nome;
> val ''a busca = fn : (int * ''a) list -> ''a -> int * ''a
Prof. DéboraPereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Listas e funções
Função que recebe uma lista como argumento e retorna um inteiro
Função que recebe uma tupla de listas como argumento e retorna uma lista (tipo genérico)
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Tipos definidos pelo usuário: exemplo de uso
Exemplo de uso
Definição do tipo
 datatype shape = point | circle of real |
 box of (real*real)
 New type names: =shape
 datatype shape =
 (shape,
 {con box : (real * real) -> shape,
 con circle : real -> shape,
 con point : shape})
 con box = fn : (real * real) -> shape
 con circle = fn : real -> shape
 con point = point : shape
load "Math";
val it = () : unit
fun area (point) = 0.0 
	| area (circle r) = Math.pi * Math.sqr(r)
 | area (box (b,h)) = b*h;
val area = fn : shape -> real
area(point);
val it = 0.0 : real
area(circle 3.0);
val it = 5.44139349655 : real
area(box(2.0,3.0));
val it = 6.0 : real
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG
*
*
*
Tratamento de exceções em ML
Exemplo: exceção do sistema
- 3 div 0;		 > Uncaught exception: Div
Exemplo: exceção definida pelo usuário
- exception Factorial;	 > exn Fatorial = Fatorial : exn
- fun checked_factorial n = if n = 0 then fact n else raise Factorial;
> val checked_factorial = fn : int -> int
Exemplo de teste
- val cf=checked_factorial;	 	> val cf = fn : int -> int
- cf 4;				> val it = 24 : int
- cf ~4;				> Uncaught exception: Factorial
Exemplo de tratador
 handle Factorial => print "Out of range.\n";
Prof. Débora Pereira Coura e Marcos Vinícius da Silva - Linguagem de Programação - UnilesteMG