Programao MultiParadigma Cristiano Bertolini cbertolinicin ufpe br Ellison
Programação Multi-Paradigma Cristiano Bertolini – cbertolini@cin. ufpe. br Ellison Siqueira – ellison. siqueira@gmail. com Guilherme Avelino – gaa@cin. ufpe. br Paulo Caetano – pcs 3@cin. ufpe. br Prof. Augusto Sampaio 1
Agenda Objetivo n Funcional versus Imperativa n Mônadas n Proposta n 2
Objetivo n Analisar os paradigmas funcionais e imperativos e como eles podem ser implementados em uma mesma linguagem de programação 3
Funcional versus imperativa (setq sum 0); ---- variavel global sum: =0 (defun se (x); ---- define a função se (setq sum(+ sum x))); --- sum: =sum+x Linguagem A cada chamada de. Funcional se um novo valor é Linguagem Imperativa adicionado a variável global sum Uso de expressões e funções (exclui comandos, variáveis e efeitos laterais) Uso de variáveis, comandos e procedimentos Implementa transparência referencial Não implementa transparência referencial efeitos laterais Não possui noção de estado Possuem noção de estados Não possui atribuição direta de valor Possui atribuição direta de valor 4
Mônadas n Uma Mônada é uma estrutura algébrica que lida com transformações de estados, exceções e continuações n São empregadas em linguagens funcionais para implementar características de linguagem imperativa n Permitem criar estruturas computacionais com estilo imperativas que, entretanto, permanecem isoladas do corpo principal do programa funcional. n Podem ser utilizadas para manter a transparência referencial ao incluir atribuição e incluem a noção de estado e controle de exceções 5
Exemplo Mônada Sem Mônadas a expressão vai retornar uma exceção Let var a = 1, b = 0 in c=a/b } Mônadas insere a noção de estado utilizando o operador //: M a = just a | Nothing Let var a = 1, b = 0 in c = a // b } 6
Propostas: construções let var x = 3 in { x : = x * x; } let var x = 3 in x : = x * x; let var x = 3 in { x : = x * x; x } let var w = 0, var a = fn x. x in { a : = let fun soma x y = x + y in soma; a(1)(2) } 7
Proposta: transparência referencial let var a = 1, var b = 2 in{ a : = b; b : = let var c = 3 in c * c; b + a } Resultado: 11 let var a = 1, var b = 2 in{ { a : = b; } { b : = let var c = 3 in c * c; “Tudo o que acontece durante a execução dum programa depende do que está explicitado no corpo e nos } argumentos das funções, não existindo qualquer entidade oculta que influencie b + a a execução dos programas e os } resultados intermediários e finais” Resultado: 3 ou 11? http: //ctp. di. fct. unl. pt/lei/ltpa/teoricas/04. html 8
Proposta: Mônadas em Haskell n n Mônada: Família de tipos m a Funções: return ¨ >>= ¨ >> ¨ Fail ¨ n Mônadas haskell Identity, aplica a função definida pela computação subseqüente ao valor retornado pela computação anterior; ¨ [], aplica a todos os elementos de uma lista a computação subseqüente e são retornados os resultados concatenados. Em caso de falha é retornado o valor []; ¨ Maybe representa computações que podem falhar ao retornar um resultado. ¨ IO, responsável pela interação entre os programas Haskell e o mundo exterior. ¨ 9
Proposta: Mônadas em Haskell Notação DO divisao 1: : Int->Maybe Int divisao 1 a b = return a >>= x -> return b >>= y -> if y==0 then Nothing else return (div x y) divisao 2: : Int->Maybe Int divisao 2 a b = do x <- return a y <- return b if y==0 then Nothing else return (div x y) 10
Proposta: variáveis monádicas let var x = 1 in let var y = do{ x : = 3; x * x } in y + x } Resultado = 10 11
Proposta: função monádica let var x = 1 in let fun f 1 z = z+1 in let fun teste y = do{ x : = y+1; z : = 2*x (f 1 y) + z} in teste x Resultado = 6 12
Proposta de implementação n Utilizar Mônadas n Incluir Atribuição na LF 2 n Incorporar o conceito de estado em um contexto específico na LF 2 n Análise de problemas e implicações no uso de Mônadas 13
Proposta: BNF Programa : : = Expressao : : = Valor | Exp. Unaria | Exp. Binaria | Exp. Declaracao | Id | Aplicacao | If. Then. Else Atribuicao : : = Id ": =" Expressao | Atribuicao "; " Atribuicao Valor : : = Valor. Concreto | Valor. Abstrato : : = Valor. Funcao Valor. Concreto : : = Valor. Inteiro | Valor. Booleano | Valor. String Expressao Exp. Binaria : : = Expressao "+" Expressao | Expressao "-" Expressao | Expressao "and" Expressao | Expressao "or" Expressao | Expressao "==" Expressao | Expressao "++" Expressao Exp. Declaracao : : = "let" Declaracao. Funcional "in" Expressao Declaracao. Funcional : : = Dec. Variavel | Dec. Funcao | Dec. Variavel. Monadica | Dec. Funcao. Monadica | Declaracao. Funcional ", " Declaracao Dec. Variavel : : = "var" Id "=" Expressao Dec. Funcao : : = "fun" List. Id "=" Expressao Dec. Variavel. Monadica : : = "var" Id "=" "do" “{“Atribuicao "; " Expressao "}“ Dec. Funcao. Monadica : : = "fun" List. Id "=" "do" “{“Atribuicao "; " Expressao "}“ Valor. Funcao : : = "fn" Id Id ". " Expressao Exp. Unaria : : = "-" Expressao | "not" Expressao | "length" Expressao. List. Id : : = Id | Id, List. Id Aplicacao: = Expressao"(" List. Exp ")“ List. Exp : : = Expressao | Expressao, List. Exp 14
Referências Bibliográficas n n n n http: //ctp. di. fct. unl. pt/lei/ltpa/teoricas/04. html http: //en. wikipedia. org/wiki/Referential_t ANDRADE, Carlos Andreazza Rego. Aspecth: uma extensão de Haskell orientada a aspectos. Recife, 2005. Dissertação (mestrado) - UFPe. CIn. Ciência da Computação; Wadler, P. Monads for funtional programming ALL ABOUT MONADS. http: //www. nomaware. com/monads/html/index. html Watt, David A. Programming Language Concepts and Paradigms, Prentice Hall Bird, R. and Wadler, P. Introduction to Functional Programming, Prentice Hall 15
- Slides: 15