Paradigmas de Linguagens de Programação - Tratamento de Exceções
IO em LF1 Paradigmas de Linguagens de Programação 2007
description
Transcript of IO em LF1 Paradigmas de Linguagens de Programação 2007
1
IO em LF1
Paradigmas de Linguagens de Programação 2007
Diego Martins, Laís Xavier,
Paulo Martinelli e Turah Xavier
2
Objetivos
• Permitir que a Linguagem Funcional 1 possa executar funções de IO da mesma forma que Haskell permite.
3
Problema
• LF1 é uma linguagem funcional e funções de IO são do paradigma imperativo.
4
Funcional x Imperativa
• Linguagens funcionais são focadas em avaliar funções matemáticas e não têm noções de estado. Enquanto linguagens imperativas são focadas em estados.
• Linguagens funcionais prezam por transparência referencial enquanto o uso de comandos imperativos podem remover essa propriedade.
5
Transparência Referencial
• Transparência referencial: É uma propriedade que “quando uma expressão ‘e’ de uma linguagem é substituída por um valor ‘V’ e esse valor ‘V’ é o resultado da avaliação dessa expressão ‘e’, a semântica do programa não se altera”.
X = 1
Inc(a) =a + 1
2 + inc (X) + inc(X) 2 + 2 + 2
6
Transparência Referencial
• Em linguagens imperativas, a transparência referencial.
Int x = 1; ( x é uma variável global)
Int inc (a) = a++;
2 + incrementa(x) + incrementa(x) =
2 + 2 + 3
7
• Quando se usa uma função de IO em que o usuário entra com um dado pelo teclado, essa função pode retornar valores diferentes para a mesma função com os mesmos parâmetros.– Ex: getInt (retorno depende do que o usuário
digitar)
• Isso quebra a transparência referencial!
Transparência Referencial
8
Transparência Referencial
• Linguagens funcionais, como Haskell, utilizam Monads para encapsular esses valores em um único tipo, o tipo IO. Mantendo assim, a transparência referencial.
• Nosso projeto se baseia nesse conceito.
9
Monads
Linguagem funcional
Comandos imperativos
Monads
10
Monads
• A utilização de monads é necessária para executar operações que são mais próximas à linguagem imperativa do que a linguagem funcional dentro da linguagem funcional.
• Essas operações são operações de IO e mudanças de estado.
11
Monads
• Esses tipos de operações introduzem na linguagem efeitos colaterais (alterar valores e estados sem retornar nenhum valor)– Ex: funções void de C
• Usando monads, essa expressão que causa efeito colateral retorna um valor “descrevendo” um efeito colateral desejado– Ex: funções void retornam um tipo IO
12
Monads em Haskell
• Alguns tipos de Monads e operadores disponíveis em Haskell:>>=>>MaybeReturn<-DOIO
13
Regras simples para utilizar a notação de Monads em Haskell
• Para executar várias ações em seqüência, como em uma linguagem imperativa, utiliza-se o DO– Exemplo:
do putString(“Digite Algo”)
a <- getString
b = a++a
putString(b)
14
Regras simples para utilizar a notação de Monads em Haskell
• Funções de IO como put*, sempre retornam um tipo IO()
• Funções de IO como get*, retornam um tipo IO(tipo do get)– Ex: getInt retorna IO(int)
15
Regras simples para utilizar a notação de Monads em Haskell
• O operador <- sempre recebe um tipo IO encapsulando outro tipo, e desencapsula esse tipo– Ex: int <- IO(int)
• ExemploLet a = getInt indo b <- ab + 1
16
Dificuldades
• The most difficult concept to master, while learning Haskell, is that of understanding and using monads.
(Yet Another Haskell Tutorial)
17
Bibliografia
• http://www.haskell.org/tutorial/io.html • http://en.wikipedia.org/wiki/Monads_in_functiona
l_programming• http://www.prairienet.org/~dsb/monads.htm• http://sigfpe.blogspot.com/2006/08/you-could-ha
ve-invented-monads-and.html• What the hell are Monads?
– http://web.cecs.pdx.edu/~antoy/Courses/TPFLP/lectures/MONADS/Noel/research/monads.html