IO em LF1 Paradigmas de Linguagens de Programação 2007

17
1 IO em LF1 Paradigmas de Linguagens de Programação 2007 Diego Martins, Laís Xavier, Paulo Martinelli e Turah Xavier

description

IO em LF1 Paradigmas de Linguagens de Programação 2007. Diego Martins, Laís Xavier, Paulo Martinelli e Turah Xavier. Objetivos. Permitir que a Linguagem Funcional 1 possa executar funções de IO da mesma forma que Haskell permite. Problema. - PowerPoint PPT Presentation

Transcript of IO em LF1 Paradigmas de Linguagens de Programação 2007

Page 1: 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

Page 2: IO em LF1 Paradigmas de Linguagens de Programação 2007

2

Objetivos

• Permitir que a Linguagem Funcional 1 possa executar funções de IO da mesma forma que Haskell permite.

Page 3: IO em LF1 Paradigmas de Linguagens de Programação 2007

3

Problema

• LF1 é uma linguagem funcional e funções de IO são do paradigma imperativo.

Page 4: IO em LF1 Paradigmas de Linguagens de Programação 2007

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.

Page 5: IO em LF1 Paradigmas de Linguagens de Programação 2007

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

Page 6: IO em LF1 Paradigmas de Linguagens de Programação 2007

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

Page 7: IO em LF1 Paradigmas de Linguagens de Programação 2007

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

Page 8: IO em LF1 Paradigmas de Linguagens de Programação 2007

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.

Page 9: IO em LF1 Paradigmas de Linguagens de Programação 2007

9

Monads

Linguagem funcional

Comandos imperativos

Monads

Page 10: IO em LF1 Paradigmas de Linguagens de Programação 2007

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.

Page 11: IO em LF1 Paradigmas de Linguagens de Programação 2007

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

Page 12: IO em LF1 Paradigmas de Linguagens de Programação 2007

12

Monads em Haskell

• Alguns tipos de Monads e operadores disponíveis em Haskell:>>=>>MaybeReturn<-DOIO

Page 13: IO em LF1 Paradigmas de Linguagens de Programação 2007

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)

Page 14: IO em LF1 Paradigmas de Linguagens de Programação 2007

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)

Page 15: IO em LF1 Paradigmas de Linguagens de Programação 2007

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

Page 16: IO em LF1 Paradigmas de Linguagens de Programação 2007

16

Dificuldades

• The most difficult concept to master, while learning Haskell, is that of understanding and using monads.

(Yet Another Haskell Tutorial)

Page 17: IO em LF1 Paradigmas de Linguagens de Programação 2007

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