12.07.2015 Views

A Linguagem Funcional Haskell - Departamento de Informática e ...

A Linguagem Funcional Haskell - Departamento de Informática e ...

A Linguagem Funcional Haskell - Departamento de Informática e ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

tipos principais únicos é a característica mínima dosistema <strong>de</strong> tipos Hindley-Milner, sendo que esteforma a base do sistema <strong>de</strong> tipos <strong>Haskell</strong>, ML,Miranda e a maioria das linguagens funcionais hojeconhecidas.Em comparação com linguagens <strong>de</strong> tiposmonomórficos como C, o leitor irá notar que opolimorfismo <strong>de</strong>senvolve expressões, e a inferênciadiminui a carga <strong>de</strong> tipos sobre os programadores.User-Defined TypesPara <strong>de</strong>finirmos nossos próprios tipos em<strong>Haskell</strong> usa-se a <strong>de</strong>claração data, ao qual estetrabalho tenta exemplificar <strong>de</strong> forma a tornar maiora compreensão do leitor.Um importante tipo que já esta pre<strong>de</strong>finidoem <strong>Haskell</strong>, é a <strong>de</strong>finição <strong>de</strong> tipos boleanos, mas sópara exemplificar iremos fazer a sua criaçãotomando como se este não existisse:data Bool = False | TrueO tipo <strong>de</strong>monstrado acima é Bool e possuiexatamente dois valores: Verda<strong>de</strong>iro e Falso. O tipoBool em <strong>Haskell</strong> possui a <strong>de</strong>nominação <strong>de</strong> tipoconstrutor, e True e False são chamadosconstrutores <strong>de</strong> dado, ou só construtores.Po<strong>de</strong>mos assim <strong>de</strong>finir diversos tipos.Similarmente po<strong>de</strong>mos <strong>de</strong>finir o tipo Cor:data Cor = Vermelho | Ver<strong>de</strong> | Azul | VioletaMas se pararmos e prestarmos atenção estasduas <strong>de</strong>finições <strong>de</strong> tipos são limitadas, ou seja, sãotipos enumerados, pois possuem um número finito<strong>de</strong> construtores <strong>de</strong> dado.Abaixo temos um exemplo com um únicoconstrutor <strong>de</strong> dados.data Point = Pt a aDefinindo o tipo <strong>de</strong> dado Point nãolimitamos o usuário, pois este po<strong>de</strong>rá <strong>de</strong>finirqualquer tipo <strong>de</strong> ponto.Um tipo como Point é freqüentementechamado <strong>de</strong> tuple type, sendo que neste caso este ésó um produto cartesiano (neste caso binário) <strong>de</strong>outros tipos. Tipos multi-construtor, como Bool eCor, são chamados (disjunto) união ou tipos soma,em contraste a tipos mono construtor.Mais importante, no entanto, é lembrar quePoint também é um exemplo <strong>de</strong> tipo polimórfico:para qualquer tipo t, haverá a <strong>de</strong>finição <strong>de</strong> pontoscartesianos que usam t como o tipo coor<strong>de</strong>nada.Note que o tipo <strong>de</strong> binário Pt é a → a →Point a, ou seja os tipos abaixo são válidos:Pt 2.0 3.0 :: Point FloatPt ‘a’ ‘b’ :: Point CharPt True False :: Point BoolNão po<strong>de</strong>mos esquecer <strong>de</strong> ressaltar que algocomo Pt ‘a’ 1 é sem tipo pois ‘a’ e 1 possuem tiposdiferentes sendo assim o próprio sistema <strong>de</strong> tipos<strong>Haskell</strong> durante a compilação irá acusar erro.É <strong>de</strong> extrema importância saber distinguir aaplicação entre construtor <strong>de</strong> dados para construirum valor e a aplicação <strong>de</strong> um tipo construtor paraconstruir um tipo. O primeiro formador acontece emtempo <strong>de</strong> execução e é como nós computamoscoisas em <strong>Haskell</strong>, já o segundo acontece em tempo<strong>de</strong> compilação e é parte do processo do sistema <strong>de</strong>tipos para assegurar tipos seguros.Existe também a possibilida<strong>de</strong> <strong>de</strong>construirmos tipos utilizando o mesmo nome para otipo construtor e para o construtor <strong>de</strong> dados, comovemos a seguir.data Point a = Point a aE já que estamos falando do sistema <strong>de</strong>tipos <strong>Haskell</strong> não po<strong>de</strong>mos <strong>de</strong>ixar <strong>de</strong> abranger tipossinônimos, sendo que estes são utilizados para<strong>de</strong>finir um mesmo tipo com outro nome, mas nãonovos tipos. Portanto tipos sinônimos criam umnovo tipo a partir <strong>de</strong> um antigo só que com outronome. Para que possamos criar tipos <strong>de</strong>sta maneirautilizamos a <strong>de</strong>claração type, como no exemploabaixo.type String = [Char]type Name = StringFunçõesComo toda e qualquer linguagem <strong>Haskell</strong>oferece funções pré-<strong>de</strong>finidas, mas seu maiorpotencial está <strong>de</strong>stinado ao programador, ou seja, alinguagem oferece muitos recursos a este, quanto acriação <strong>de</strong> novas funções. Alguns <strong>de</strong>ste recursos jáforam <strong>de</strong>monstrados no sistema <strong>de</strong> tipos, agorairemos abordar a parte funcional da linguagem.Não iremos abordar funções oferecidas pelalinguagem, pois nossa intenção não é ensinar aprogramar em <strong>Haskell</strong> e tão pouco ensinar a utilizarfunções pré-<strong>de</strong>finidas ou oferecidas pela linguagem.Geralmente quando <strong>de</strong>finimos uma funçãoem <strong>Haskell</strong> utilizamos um "type signature" emprimeiro lugar e na próxima linha iniciamos a<strong>de</strong>claração da função, como no exemplo que segue:add :: Int → Int → Int -- type signatureadd x y = x + y -- Corpo da função

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!