170 likes | 262 Views
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.
E N D
IO em LF1Paradigmas 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 • LF1 é uma linguagem funcional e funções de IO são do paradigma imperativo.
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.
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”.
Transparência Referencial • Em linguagens imperativas, a transparência referencial.
Transparência Referencial • 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 • 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.
Monads Linguagem funcional Monads Comandos imperativos
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.
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
Monads em Haskell • Alguns tipos de Monads e operadores disponíveis em Haskell: >>= >> Maybe Return <- DO IO
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)
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)
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) • Exemplo Let a = getInt in do b <- a b + 1
Dificuldades • The mostdifficult concept to master, while learning Haskell, is that of understanding and using monads. (Yet Another Haskell Tutorial)
Bibliografia • http://www.haskell.org/tutorial/io.html • http://en.wikipedia.org/wiki/Monads_in_functional_programming • http://www.prairienet.org/~dsb/monads.htm • http://sigfpe.blogspot.com/2006/08/you-could-have-invented-monads-and.html • What the hell are Monads? • http://web.cecs.pdx.edu/~antoy/Courses/TPFLP/lectures/MONADS/Noel/research/monads.html