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.

Usando tipos e valores no exemplo abaixoescrevemos alguns typings.5 :: int‘a’ :: charO símbolo "::" <strong>de</strong>ve ser lido como "temtipo".Funções em <strong>Haskell</strong> geralmente são<strong>de</strong>finidos por uma série <strong>de</strong> equações, mas existe umtipo especial chamado "type signature <strong>de</strong>claration",que <strong>de</strong>clara um tipo explicito para a função.Um exemplo segue abaixo.inc :: int → int "type signature <strong>de</strong>claration".As "type signature <strong>de</strong>claration" não são <strong>de</strong>uso obrigatório, mas regras geralmente sãoutilizadas pelo programador para que este saiba quetipo possui cada função.Quando queremos <strong>de</strong>monstrar que umaexpressão e 1 é avaliada ou "reduzida" para umaoutra expressão e 2 , nós indicamos <strong>de</strong>sta maneiraque se segue:e 1 ⇒ e 2Por exemplo note que:inc (inc 3) ⇒ 5Tipos PolimórficosTipos monomórficos são encontramos commuita frequência em diversas linguagens <strong>de</strong>programação, mas estes restrigem <strong>de</strong> certa forma acapacida<strong>de</strong> do programador.<strong>Haskell</strong> também incorpora tipospolimórficos - tipos que são universalmentequantificados em algum lugar e referem-se a todosos outros tipos.Expressões <strong>de</strong> tipos polimórficosessencialmente <strong>de</strong>screvem famílias <strong>de</strong> tipos. Porexemplo, (∀ a) [a] é a família <strong>de</strong> tipos consistindo<strong>de</strong>, para todo tipo a, o tipo <strong>de</strong> listas <strong>de</strong> a.Listas <strong>de</strong> inteiros [1, 2, 3], listas <strong>de</strong>caracteres [‘h’, ‘e’, ‘l’ , ‘l’, ‘o’], e até mesmo listas<strong>de</strong> listas <strong>de</strong> inteiros[[2], [4], [6]]. Todos sãomembros <strong>de</strong>sta família, ou seja, no momento queusarmos a variável a está po<strong>de</strong> ser <strong>de</strong> qualquer tiposendo <strong>de</strong>s<strong>de</strong> que todos sejam do mesmo tipo.<strong>Haskell</strong> não irá admitir algo como [‘b’ , 2 ]. Nota-seentão que através da <strong>de</strong>finição <strong>de</strong> uma função queutiliza tipos polimórficos construímos, ou temos aoportunida<strong>de</strong>, <strong>de</strong> construir uma função genérica,on<strong>de</strong> esta po<strong>de</strong>rá ser utilizada para qualquer família<strong>de</strong> tipos.Para fazermos a <strong>de</strong>claração <strong>de</strong> um tipopolimórfico não necessitamos explicitar por escritoo símbolo do quantificação universal (∀). Em outraspalavras todos os tipos <strong>de</strong> variáveis estãoimplicitamente quantificados.Listas são muito utilizados em linguagensfuncionais e são um ótimo veículo para quepossamos <strong>de</strong>monstrar os princípios dopolimorfismo.A lista [1, 2, 3 ] é um resumo da lista 1: (2:(3: [])), on<strong>de</strong> [] é lista vazia e : é o operador <strong>de</strong>infixação, é ele que adiciona o primeiro argumentopara a frente do segundo e assim por diante, e <strong>de</strong>stamaneira conseguimos <strong>de</strong>finir um lista.Ao <strong>de</strong>finirmos uma função que conta onúmero <strong>de</strong> elementos <strong>de</strong> uma lista, notamos asfacilida<strong>de</strong>s oferecidas por este sistema <strong>de</strong> tipos.Veja o exemplo abaixo:length :: [a] → intlength [] = 0length (x : xs ) = 1 + length (xs)Se prestarmos atenção a <strong>de</strong>finição é quaseque auto - explicativa. Nós po<strong>de</strong>mos ler a funçãocomo sendo "O tamanho da lista vazia é zero, e otamanho da lista cujo primeiro elemento é x e orestante e da lista é xs é 1 mais o tamanho <strong>de</strong> xs,passado novamente a esta função.A função length é um exemplo <strong>de</strong> funçãopolimórfica e sua "type signature <strong>de</strong>claration"<strong>de</strong>monstra isto. Sua gran<strong>de</strong> vantagem vem quando<strong>de</strong>pois <strong>de</strong> <strong>de</strong>finida esta po<strong>de</strong> ser aplicada a qualquertipo <strong>de</strong> lista e é isto que notamos no exemploabaixo, pois são passados para a mesma funçãodiversos tipos <strong>de</strong> listas entre elas listas <strong>de</strong> tipo [Int],Char], e até mesmo, [[Int]] lista <strong>de</strong> lista <strong>de</strong> inteiros.length [1, 2, 3] ⇒ 3length [‘a’, ‘b’] ⇒ 2length [[1], [2], [3], [4]] ⇒ 4Com tipos polimórficos, achamos quealguns tipos estão em um senso extremamente maisgeral que outros. Por exemplo o tipo [a] é mais geraldo que o tipo [Char].O Sistema <strong>de</strong> tipos <strong>Haskell</strong> possui duasimportantes proprieda<strong>de</strong>s: Primeira, toda expressãobem tipada é garantida para ter um único tipoprincipal (explicado abaixo), e a Segunda, é que otipo principal po<strong>de</strong> ser inferido automaticamente.Uma expressão ou função tipo principal é otipo menos geral, que, intuitivamente, "Contémtodas as instâncias da expressão". Por exemplo, otipo principal da função length é expressado como[a] → a; os tipos [b] → a, a → a , ou até mesmo <strong>de</strong>a são muito gerais, consi<strong>de</strong>rando que algum tipocomo [Int] → Int é mais especifico. A existência <strong>de</strong>

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

Saved successfully!

Ooh no, something went wrong!