linguagem funcional

119
2.2 .1 2.2 Linguagens de Programação Funcional Em vez disso, as linguagens de PROGRAMAÇÃO FUNCIONAL baseiam-se na TEORIA DAS FUNÇÕES MATEMÁTICAS Fortemente afetadas pela arquitetura dos computadores convencionais Até agora lidamos com as linguagens de PROGRAMAÇÃO ORIENTADA A COMANDO, chamadas de IMPERATIVAS Ghezzi Jazayeri

Upload: alexandre-machado-lauredo

Post on 01-Jul-2015

333 views

Category:

Documents


0 download

TRANSCRIPT

2.2 Linguagens de Programao Funcional

Ghezzi 2.2.1 Jazayeri

At agora lidamos com as linguagens de PROGRAMAO ORIENTADA A COMANDO, chamadas de IMPERATIVASFortemente afetadas pela arquitetura dos computadores convencionais

{Em vez disso, as linguagens de PROGRAMAO FUNCIONAL baseiam-se na

TEORIA DAS FUNES MATEMTICAS

2.2. Linguagens de Programao FuncionalA motivao das linguagens funcionais

2.2.2

Ghezzi Jazayeri

no a eficincia da execuo e sim os seguintes aspectos:Qual a mais apropriada unidade de decomposio de um programa ? Como uma linguagem de programao pode dar um melhor suporte composio de componentes independentes?

2.2. Linguagens de Programao Ghezzi Jazayeri Funcional Nas LPs procedurais, as unidades de decomposio so os procedimentos (procedures), ? que podem causar efeitos colaterais,nas estruturas globais que comunicam-se entre si Tipos abstratos de dados tentam modularizar um programa, pelo empacotamento de dados e de operaes, para limitar o escopo dos efeitos colaterais, nas unidades encapsuladas

2.2.3

?

A programao funcional baseia-se sem varivel nas funes matemticas, ? operando sobre valores e produzindo valores, sem qqr efeito colateral

2.2. Linguagens de Programao Funcional 1

2.2.4

Ghezzi Jazayeri Inicialmente, sero abordadas as principais diferenas da programao funcional, ilustradas pelos conceitos bsicos da programao imperativa Para salientar mais ainda essas diferenas, as funes matemticas sero comparadas com as funes das linguagens imperativas

2 em seguida vamos apresentar a linguagem de programao funcional: HASKELL

2.2. Linguagens de Programao Funcional

2.2.5

Ghezzi Jazayeri As linguagens de programao funcional primitivas, comeando por LISP, adotavam escopo e tipagem dinmicas Scheme um dialeto de LISP, que adotou escopo esttico na linguagem Mais tarde, linguagens funcionais, tais como ML, Haskell, adotaram no somente escopo esttico mas tambm tipagem forte Haskell puramente funcional, no tendo variveis nem comando de atribuio. Assim, no inclui recursos imperativos e no produz efeitos colaterais.

2.2. Linguagens de Programao Funcional

2.2.6

2.2.1 Caractersticas de Linguagens Imperativas Jazayeri GhezziAs linguagens de programao imperativa so caracterizadas por trs conceitos: variveis, atribuio e seqncia de execuo

O estado de um programa imperativo mantido em variveis de programa Essas variveis so associadas a alocaes de memria, que so caracterizadas por: um endereo (l-value) e um valor armazenado (r-value) O acesso ao valor de uma varivel pode ser APONTADOR direto via seu l-value ou indiretamente via o r-value de uma outra varivel

2.2. Linguagens de Programao Funcional

2.2.7

2.2.1 Caractersticas de Linguagens Imperativas Jazayeri GhezziAs linguagens de programao imperativa so caracterizadas por trs conceitos: variveis, atribuio e seqncia de execuo

O valor de uma varivel alterado na execuo de um comando de atribuio O comando de atribuio introduz uma ordem de dependncia no programa: o valor de uma varivel pode ser diferente antes e depois da execuo de um comando de atribuio ATRIBUIO e seqncia Os efeitos em um programa, ento, de execuo DEPENDEM DA ORDEM em que os comandos so escritos e executados

2.2. Linguagens de Programao Funcional

2.2.8

2.2.1 Caractersticas de Linguagens Imperativas Jazayeri GhezziAs linguagens de programao imperativa so caracterizadas por trs conceitos: variveis, atribuio e seqncia de execuo

Na matemtica, variveis so amarradas a valores e uma vez amarradas, no trocam de valores Assim, o valor de uma funo INDEPENDE dos conceitos da programao imperativa, como por exemplo, A ORDEM DA EXECUO DOS COMANDOS Uma funo matemtica define um mapeamento de um valor de domnio para um valor de faixa

2.2. Linguagens de Programao Funcional

2.2.9

2.2.1 Caractersticas de Linguagens Imperativas Jazayeri Ghezzi FUNO MATEMTICA um conjunto de pares ordenados que relaciona cada elemento no domnio com um nico correspondente elemento na faixa

{FUNO na PROGRAMAO IMPERATIVA descrita como algoritmo que especifica como computar os valores da faixa para um valor de domnio em uma

DETERMINADA SEQNCIA DE PASSOSLembrando que as linguagens de programao imperativa so caracterizadas por trs conceitos: variveis, atribuio e seqncia de execuo

2.2. Linguagens de Programao Funcional

2.2.1 Caractersticas de Linguagens Imperativas Jazayeri GhezziREPETIO (LOOP) uma outra caracterstica das linguagens imperativas, usada, freqentemente, para computar os valores desejados Os loops so usados, por exemplo, para: varrer uma seqncia de alocaes de memria (p/ex. arrays) acumular o valor de uma dada varivel Em contraste, em funes matemticas, os valores so computados pela aplicao de funo RECURSO usada no lugar de ITERAO COMPOSIO DE FUNO usada para construir funes mais poderosas

2.2.1 0

2.2. Linguagens de Programao Funcional

2.2.1 Caractersticas de Linguagens Imperativas Jazayeri Ghezzi Por causa das diferentes caractersticas As LINGUAGENS IMPERATIVAS so chamadas de BASEADAS EM ESTADO ou ORIENTADA A COMANDO As LINGUAGENS FUNCIONAIS so chamadas de BASEADAS EM VALORES ou APLICATIVAS

2.2.1 1

2.2. Linguagens de Programao Funcional

CONCEITO 2.2.1 2 2.2.1 Funes na Matemtica e na Programao Jazayeri Ghezzi Uma funo uma regra para mapeamento de membros de um conjunto domnio para um conjunto faixa Ex. funo quadrado poderia mapear elementos do conjunto inteiro p/conjunto natural A definio de uma funo constituda de duas partes: uma assinatura e uma regra de mapeamento A assinatura especifica o domnio e a faixa A regra de mapeamento especifica o valor da faixa associado a cada valor de domnioEX

Assinatura. quadrado: inteiro p natural quadrado(n) = n X n Regra de mapeamento.

2.2. Linguagens de Programao Funcional

DEFINIO 2.2.1 3 2.2.1 Funes na Matemtica e na Programao Jazayeri GhezziEX

Assinatura. quadrado: inteiro p natural quadrado(n) = n X n Regra de mapeamento.

Ateno: na literatura aparece o smbolo | para denotar definida como, mas aqui est sendo usado o smbolo = adotado em Haskell. Ento, encontra-se tambm:

quadrado: inteiro p natural quadrado (n)

Assinatura.

| n X n .Regra de mapeamento

2.2. Linguagens de Programao Funcional

DEFINIO 2.2.1 4 2.2.1 Funes na Matemtica e na Programao Jazayeri GhezziEX

Assinatura. quadrado: inteiro p natural quadrado(n) = n X n Regra de mapeamento.

funo nomeada quadrado, acima, definida como o mapeamento de elementos do conjunto inteiro p/conjunto natural smbolo

= em Haskel significa definida como

n um parmetro, que representa qualquer membro do conjunto do domnio nas definies de funo, por conveno, a assinatura omitida se domnio e faixa so implcitos no contexto

2.2. Linguagens de Programao Funcional

APLICAO 2.2.1 Funes na Matemtica e na Programao Jazayeri GhezziEX

2.2.15

Assinatura. quadrado: inteiro p natural quadrado(n) = n X n Regra de mapeamento.

Uma vez definida uma funo, ela pode ser aplicada a qualquer membro do conjunto domnio A aplicao produz (ou resulta, ou retorna) o elemento associado na faixa No momento da aplicao, um elemento particular do domnio especificado Esse elemento, chamado o argumento, substitui o argumento da definio

2.2. Linguagens de Programao Funcional

APLICAO 2.2.1 6 2.2.1 Funes na Matemtica e na Programao Jazayeri GhezziEX

Assinatura. quadrado: inteiro p natural quadrado(n) = n X n Regra de mapeamento.

A substituio puramente textual

? Se a definio contm aplicaes, elas so aplicadas na seqncia at ser alcanada uma expresso que possa ser avaliada para produzir o resultado da aplicao originalquadrado (2) produz o valor 4 de acordo com a sua definio

2.2. Linguagens de Programao Funcional

APLICAO 2.2.1 7 2.2.1 Funes na Matemtica e na Programao Jazayeri GhezziEX

Assinatura. quadrado: inteiro p natural quadrado(n) = n X n Regra de mapeamento.

O parmetro n uma varivel matemtica diferente de uma varivel de programa Na definio da funo, n representa qualquer membro do conjunto domnio

{?

Na aplicao da funo, dado um valor especfico, que nunca trocado Em contraste, a varivel de programa, no paradigma imperativo, pode assumir diferentes valores durante o curso da execuo de um programa

2.2. Linguagens de Programao Funcional

2.2.1 Funes na Matemtica e na Programao Jazayeri GhezziDE FUNES Novas funes podem ser criadas pela COMBINAO DE OUTRAS A forma mais comum de combinao de funes a COMPOSIO Se uma funo F definida como a composio de duas funes G e H, escrita como F a aplicao de F definida pela aplicao de H e ento a aplicao de G para chegar finalmente ao resultado

2.2.1 COMBINAO 8

=

G o H,

Ghezzi Jazayeri 2.2. Linguagens de Programao Funcional 2.2.1 Funes na Matemtica e naProgramao

2.2.1 9

Nas LPs convencionais, uma funo definida proceduralmente A regra de mapeamento de um valor do domnio para um valor de faixa determinada em termos de passos que necessitam ser executados em uma certa ordem especificada pela estrutura de controle Contraste entre convencionais e funcionais Por outro lado, as funes matemticas so DEFINIDAS APLICATIVAMENTE Muitas funes matemticas so definidas recursivamente, i.e, a definio da funo contm uma aplicao da prpria funo

2.2. Linguagens de Programao Funcional

RECURSO 2.2.2

0 2.2.1 Funes na Matemtica e na Programao Jazayeri Ghezzi Muitas funes matemticas so definidas recursivamente, i.e, a definio da funo contm uma aplicao da prpria funo

Por exemplo, a definio matemtica padro de fatorial de um nmero natural n! = if n = 0 then 1 else n* (n-1)! Outro exemplo a possibilidade de formular uma funo recursiva p(n, i), de nmeros naturais para booleano, que coopera para determinar se um nmero primo prime (n) = if n = 2 then true else p(n, n div 2) Essa funo auxiliar p(n,i) produz true se n no tem divisor na faixa 2..i,p( n, i ) recursiva

p (n, i) = if (n mod i) = 0 then false else if i = 2 then true else p (n, i-1)

2.2. Linguagens de Programao Funcional

RECURSO 2.2.2

1 2.2.1 Funes na Matemtica e na Programao Jazayeri Ghezzi funo recursiva, de nmeros naturais para booleano, que determina se um nmero primo prime (n) | if n = 2 then true else p(n, n div 2) A funo auxiliar p(n,i) produz true se n no tem divisor na faixa 2..i,

p (n, i) | if (n mod i) = 0 then false else if i = 2 then true else p (n, i-1) Notar como a chamada recursiva p (n, i-1) assume o papel da iterao adotada no loop de um programa imperativo Recurso uma tcnica poderosa para soluo de problemas, usada pesadamente em programao com funes

p( n, i ) recursiva

2.2. Linguagens de Programao Funcional

2.2.1 Princpios da programao funcionalA programao funcional tem trs componentes primrios:1) Um conjunto de objetos de dados 2) Um conjunto de funes embutidasalta 3) Um conjunto de formas funcionais ordem ? nas expresses (tambm chamadas funes de alta ordem) para a construo de novas funes

Ghezzi Jazayeri

2.2.2 2

Obs.: Funes de alta ordem aceitam uma ou mais funes, como entrada/sada de uma funo.

Funes de alta ordem aceitam uma ou mais funes, como entrada/sada de uma funo. Em matemtica, tambm so conhecidas por operadores ou funes. Derivada no clculo um ex., pq mapeia uma funo para outra. No clculo lambda no tipado, todas as funes so de alta ordem. No clculo lambda tipado, do qual a maioria das linguagens funcionais so derivadas, funes de alta ordem so geralmente aquelas com tipos que aparecem com mais de uma seta. Na programao funcional, funes de alta ordem que retornam outras funes, so ditas currificadas (curried). A funo map encontrada em muitas LPs funcional um exemplo de uma funo de alta ordem. Ela tem como parmetros uma funo f e uma lista de elementos, e como resultado, retorna uma nova lista com f aplicada a cada elemento da lista. Outro tipo muito comum so funes de ordenao que aceitam uma funo de comparao como um parmetro, permitindo ao programador separar o algoritmo de ordenao das comparaes dos itens a serem ordenados. Um exemplo disso a funo qsort C padro. Outros exemplos de funes de alta ordem incluem fold, function composition, integrao, e a funo constant-function x. y.x.

2.2. Linguagens de Programao Funcional

2.2.1 Princpios da programao funcional A programao funcional tem trs componentes primrios: 1) Um conjunto de objetos de dados

Ghezzi Jazayeri

2.2.2 4

Tradicionalmente, as linguagens de programao funcional oferecem um mecanismo de estruturao de dados exclusivo de alto nvel tal como uma lista ou um array

2.2. Linguagens de Programao Funcional

2.2.1 Princpios da programao funcional A programao funcional tem trs componentes primrios:

Ghezzi Jazayeri

2.2.2 5

2) Um conjunto de funes embutidas Essas funes tratam os objetos de dados bsicos Por exemplo: As LPs funcionais oferecem um nmero de funes para construo de acesso a listas

2.2. Linguagens de Programao Funcional 2.2.1 Princpios da programao funcional

Ghezzi Jazayeri

2.2.2 6

A programao funcional tem trs componentes primrios:

3) Um conjunto de formas funcionais nas expresses(tambm chamadas de funes de alta ordem)

para a construo de novas funesEstilo de programao baseado no uso de funes

Todas as expresses so baseadas em funes(funes podem ser argumentos de outras funes) Toda a programao baseada na

avaliao de expresses para gerar valores(cada valor tem um tipo associado, que pode ser implcito)

2.2. Linguagens de Programao Funcional

2.2.1 Princpios da programao funcional

Ghezzi Jazayeri

2.2.2 7

A programao funcional tem trs componentes primrios:

3) Um conjunto de formas funcionais nas expresses(tambm chamadas de funes de alta ordem)

para a construo de novas funesUm exemplo bastante comum de uma expresso a composio de funo Outro exemplo comum a reduo de funo A forma funcional da expresso reduce aplica uma funo binria pelos sucessivos elementos de uma seqncia

2.2. Linguagens de Programao 2.2.1 Princpios da programao 2.2.2 Funcional funcional 8 3) Um conjunto de formas funcionais (tambm chamadasGhezzi Jazayeri de funes de alta ordem) para a construo de novas funes

A forma funcional reduce aplica uma funo binria pelos sucessivos elementos de uma seqncia

Por exemplo: - reducing + sobre um array produz a soma dos elementos do array - reducing * sobre o array produz o produto dos elementos do array Em APL, / a forma funcional de reduo (chamada operator), que precisa de uma operao como argumento Por a reduo soma pode ser executada por /+ a reduo multiplicao pode ser executada por /* exemplo

2.2. Linguagens de Programao Funcional

3) Um conjunto de formas funcionais Jazayeri (tambm chamadas de funes de alta ordem) para a construo de novas funes

2.2.1 Princpios da programao funcional Ghezzi

2.2.2 9

As formas funcionais permitem que programadores definam novas funes como combinaes de funes sem o uso explcito de estruturas de controle tais como comandos de iterao e condicionais As funes so entidades de 1 classe, porque podem ser: -passadas como parmetros -retornadas como resultado -armazenadas em estruturas de dados

2.2. Linguagens de Programao Funcional

2.2.1 2.2.3 Princpios da programao funcionalA execuo de programas funcionais execuo de programas baseada sobre dois mecanismos funcionais baseada sobre dois fundamentais: fundamentais: amarrao e aplicao mecanismos

Ghezzi Jazayeri

2.2.3 0

1) Amarrao usada para associar valores a nomes Dados e funes podem ser usados como valores 2) Aplicao usada para computar novos valores

2.2. Linguagens de Programao Funcional

2.2.1 Princpios da programao funcional

2.2.3 Princpios da programao funcionalLambda Calculus

Ghezzi Jazayeri

2.2.3 1

A um clculo simples que pode ser usado execuo de programas funcionais baseada sobre dois para modelar, precisamente, o comportamento das funes mecanismos fundamentais:

pela definio das semnticas de amarrao e aplicaoAlonzo Church desenvolveu Lambda Calculus em 1930 ver gjm.lambook88 como uma teoria de funes que oferece regras para a manipulao de funes de uma forma puramente sinttica

O desafio de resolver todas as questes matemticas:1936: Church Todas as propostas srias de um modelo de computao tm o mesmo poder, i.e, calculam as mesmas funes ou reconhecem as mesmas linguagens. equivalncia6. Mquinas de Turing 6.32

Mquina de Turing mTModelo matemtico do processo de computao Pretende alcanar um modelo universalmente aceito! Principal uso: demonstrar o que ou no computvel6. Mquinas de Turing

6.33

Tese de Church1- Todos os modelos razoveis de procedimento so equivalentes 2- Mas a mT revelou-se o modelo mais flexvel para as demonstraes do que ou no computvel

6. Mquinas de Turing

6.34

2.2. Linguagens de ProgramaoPrincpios da programao 2.2.3 2.2. 3 Funcional 5 funcional Ghezzi Jazayeri 2.2.3.2 Lambda calculus: um modelo de computao

por funes Embora Lambda Calculus tenha surgido como um desvio da lgica matemtica para prover um fundamento para a matemtica, ela tem conduzido a ramificaes considerveis na teoria da linguagem de programao: 1) Embora Lambda Calculus tenha poder para representar todas as funes computveis, a simplicidade de sua sintaxe e sua semntica prov um veculo excelente para o estudo do significado de conceitos de linguagem de programao

2.2. Linguagens de ProgramaoPrincpios da programao 2.2.3 2.2. 3 Funcional 6 funcional Ghezzi Jazayeri 2.2.3.2 Lambda calculus: um modelo de computao

por funes Embora Lambda Calculus tenha surgido como um desvio da lgica matemtica para prover um fundamento para a matemtica, ela tem conduzido a ramificaes considerveis na teoria da linguagem de programao: 2) Todas as linguagens de programao funcional podem ser vistas como uma variao sinttica de Lambda Calculus, tal que suas sintaxe e implementao possam ser analisadas no contexto de Lambda Calculus

2.2. Linguagens de ProgramaoPrincpios da programao 2.2.3 2.2. 3 Funcional 7 funcional Ghezzi Jazayeri 2.2.3.2 Lambda calculus: um modelo de computao

por funes Embora Lambda Calculus tenha surgido como um desvio da lgica matemtica para prover um fundamento para a matemtica, ela tem conduzido a ramificaes considerveis na teoria da linguagem de programao: 3) Semntica denotacional, um dos primeiros mtodos de especificao formal de linguagens, expressa suas definies usando as funes de alta ordem de Lambda Calculus

2.2. Linguagens de ProgramaoPrincpios da programao 2.2.3 2.2. 3 Funcional 8 funcional Ghezzi Jazayeri 2.2.3.2 Lambda calculus: um modelo de computao

por funes Lambda calculus um clculo simples que modela os aspectos computacionais de funes O estudo de lambda calculus nos ajuda a compreender os elementos da programao funcional e o entendimento da semntica das linguagens de programao funcional, independentemente, dos detalhes de sintaxe de uma linguagem particular de programao funcional

2.2.3.2 Lambda calculus: 2.2. Linguagens de Programao Funcional de computao por 2.2.3 3 Princpios da programao um modelo funes 9 funcional H 3 espcies de expresses em lambda calculus: Ghezzi Jazayeri

e1 um simples identificador tal como x, ou uma constante tal como 3

Ex: funo quadrado definida como

(Px.x*x) e2 uma definio de funo, com a forma (Px.e), que representa a expresso e com x entendida como uma varivel amarrada. A expresso e representa o corpo da funo e x o argumento da funo. A expresso e pode conter qualquer das trs formas de expresso lambda: e1, e2 ou e3.e3 uma aplicao de funo com a forma (e1 e2), que representa a expresso e1 aplicada a expresso e2.Ex

funo quadrado aplicada ao valor 2 ((Px.x*x)2)

2.2. Linguagens de Programao Funcional programao funcional 2.2. 3 Princpios da

2.2.4 2.2.3.2 Lambda calculus: um modelo de computaoGhezzi Jazayeri por funes 0

Parnteses podem ser omitidos de (e1 e2) e de (Px.e) Na ausncia de parnteses, na aplicao de funo, a precedncia de associao da esquerda para a direita Assim, e1 e2 e3 significa ((e1 e2) e3) aplicao de funo tem precedncia maior que definio de funo Exemplo: Px.y z significa (Px.(y z))

2.2. Linguagens de Programao Funcional programao funcional 2.2. 3 Princpios da

2.2.4 2.2.3.2 Lambda calculus: um modelo de computaoGhezzi Jazayeri por funes 1

Uma varivel que aparece numa definio de funo F dita livre em F se ela no amarrada em F Variveis amarradas so como parmetros formais numa definio de rotina e agem como variveis locais Variveis livres so como variveis no locais que sero amarradas em um nvel mais externo Por ex, a definio de funo Px.xk define a funo ksima potncia com x como uma varivel amarrada e k como uma varivel livre

2.2. Linguagens de Programao Funcional programao funcional 2.2. 3 Princpios da

2.2.4 2.2.3.2 Lambda calculus: um modelo de computaoGhezzi Jazayeri por funes 2

A sintaxe para expresses lambda mostra que a aplicao de funo utiliza a forma de prefixo sendo a notao usual f(x) substituda por f x

2.2. Linguagens de Programao Funcional programao funcional 2.2. 3 Princpios da

2.2.4 2.2.3.2 Lambda calculus: um modelo de computaoGhezzi Jazayeri por funes 3 Implicitamente foi assumido que as funes tm um s argumento, realmente, lambda calculus usa uma alternativa ingnua para funes com mltiplos argumentos. Todas as funes so reduzidas para funes de argumento nico por meio de um mecanismo conceitual chamado currying (aps o lgico Haskell B. Curry t-la introduzido)

P/ex, podemos expressar a soma de 1 e 3, normalmente escrito como 1+3, ou na forma funcional, soma (1,3) Na sintaxe de lambda calculus, escreveramos: soma 1 3 ou usando o operador +: + 1 3, que agrupa (+1) 3 A expresso (+1) denota a funo que adiciona 1 ao argumento, no caso o valor 3.

2.2. Linguagens de Programao Funcional programao funcional funes 2.2.4 2.2. 3 Princpios da 2.2.3.2 Lambda calculus: um modelo de computao por 4

Lambda calculus captura o comportamento de funes com um conjunto de regras de reescrita de expresses lambda Ghezzi A reescrita de uma expresso modelaJazayeri um passo na computao de uma funo Para aplicar uma funo a um argumento, ns reescrevemos a definio da funo, substituindo ocorrncias da varivel amarrada pelo argumento para o qual a funo est sendo aplicada

2.2. Linguagens de Programao Funcional

Ghezzi Jazayeri 2.2.1 Princpios da programao funcionalfuncional 2.2.3 Princpios da programao

2.2.4 5

A seguir, faremos: execuo de programas

funcionais baseada sobre dois uma reviso dos elementos bsicos da mecanismos fundamentais:programao funcional, usando a sintaxe de Haskell

2.2. Linguagens de Programao Funcional

Ghezzi Jazayeri 2.2.2 Haskell www.dpi.inpe.br/cursos/cap365/funcional.ppt 2.2.3 Princpios da programao funcional Supondo o seguinte trecho em Java, baseado em atribuio de varivel, para soma de 1 a 100 A execuo de programas funcionais baseada int total = 0; total for (int i = 1; i Float sum x y = x + y sum2 :: Float -> Float sum2 y = sum 2 y perimetro :: Float -> Float perimetro r = 2 * pi * r area :: Double -> Double area r = pi * r ^ 2

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.5 5 Ghezzi Jazayeri www.dpi.inpe.br/cursos/cap365/funcional.ppt Tuplas 2.2.3 Princpios da programao funcional

Haskell permite composio de tipos: A execuo Integer) -- pares de inteiros (Integer, de programas funcionais baseada sobre dois mecanismos fundamentais: (Integer, Char, Bool) etc. Em geral, (A, B) representa um tipo, cujo primeiro membro do tipo A e o segundo membro do tipo B. O emprego de tuplas uma estratgia para permitir o retorno de mais de um valor da funo, que aparece no formato de tupla.

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.5 6 Haskell permite composio deGhezzi Jazayeri tipos:

Tuplas 2.2.3 Princpios da programao funcional

(Integer, Integer) -- pares de inteiros (Integer, Char, Bool) etc. A execuo de programas funcionais baseada Em geral, (A,mecanismos um tipo, cujo primeiro sobre dois B) representa fundamentais:membro do tipo A e o segundo membro do tipo B. Exemplo de uma funo que devolve os dois valores: a soma e a subtrao de dois argumentos de entrada.

soma_e_sub :: (Int,Int) -> (Int,Int) soma_e_sub (a,b) = (a+b, a-b) Prelude> soma_e_sub (1,2) EX. de (3,-1) execuo: www.dpi.inpe.br/cursos/cap365/funcional.ppt

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.5 7 Ghezzi Jazayeri www.dpi.inpe.br/cursos/cap365/funcional.ppt 2.2.3 Princpios da programao funcional

Conjunto de definies de funes quadr :: Int -> Int -- assinatura quadr n = n * n -- regra de mapeamento dobro :: Int -> Int dobro n = 2 * n dobrQuadr :: Int -> Int dobrQuadr n = quadr ( dobro n )

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.5 8 Ghezzi Jazayeri

2.2.3 Princpios da programao funcional Uma funo um mapeamento de Funesvalores de um tipo em outro tipo

not :: Bool -> Bool isDigit :: Char -> Bool add :: (Int, Int) -> Int add x y = x + y

www.dpi.inpe.br/cursos/cap365/funcional.ppt

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.5 9 Funcional Ghezzi Jazayeri

2.2.3 Princpios da programao funcional FunesMatemticaf(x) f(x,y) f(g(x)) f(x, g(y)) f(x) g(y)multiplica f(a,b) + cd

Aplicao de funes em Haskell

Haskellf x f x f(g f x f x f a y x) (g y) * g y b + c * d

precedncia de aplicao de funes maiorwww.dpi.inpe.br/cursos/cap365/funcional.ppt

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.6 0 Ghezzi Jazayeri Voltando ao exemplo em Tuplas

2.2.3 Princpios da programao funcional

soma_e_sub (a,b) = (a+b, a-b) aparece um nico parmetro, a tupla, que tem dois valores encapsulados. A execuo de programas funcionais baseada sobre dois mecanismos fundamentais:

Funo Currificada

Uma variao transformar a verso acima em uma verso currificada, reescrevendo soma_e_sub (a,b) como:soma_e_sub_curr :: Int -> Int -> (Int,Int)

soma_e_sub_curr a b = (a+b, a-b)Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.6 1 Ghezzi Jazayeri mais abrangente de funo currificada Um exemplo

2.2.3 Princpios da programao funcional

f_nao_currificada (x,y,z,w) = x + y + z + w f_currificada x y z w = x + y + z + w

A execuopermitidas para execuo: Alternativas de programas funcionais baseada sobre dois mecanismos fundamentais:Main> 18 Main> 18 Main> 18 Main> 18 Main> 18 Main> 18 f_currificada 3 4 5 6 (f_currificada 3) 4 5 6 ((f_currificada 3) 4) 5 6 (((f_currificada 3) 4) 5) 6 ((((f_currificada 3) 4) 5) 6) f_nao_currificada (3, 4, 5, 6)

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.6 2 Ghezzi Jazayeri Observaes importantes

Funo Currificada 2.2.3 Princpios da programao funcionalf_nao_currificada (x,y,z,w) = x + y + z + w f_currificada x y z w = x + y + z + w

A execuo de programas funcionais baseada Uma funo de n parmetros pode ser contrada em sobre dois mecanismos fundamentais:uma funo de um parmetro. O modo como os passos podem ocorrer nas vrias alternativas de execues vistas foi possvel devido ao fato dos parmetros estarem livres entre si. Vimos a transformao abstrata de vrias somas de acordo com a associatividade da esquerda para a direita. Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.6 3 Ghezzi Jazayeri Observaes importantes Funo Currificada

2.2.3 Princpios da programao funcional

f_nao_currificada (x,y,z,w) = x + y + z + w f_currificada x y z w = x + y + z + w

A execuo de programas funcionais baseada Essa abstrao, Main> seguindo a fundamentais: sobre dois mecanismosf_currificada 3 4 5 6 18associatividade esq./dir., em que o valor 3 foi o primeiro a ser avaliado e o valor 6 o ltimo a ser avaliado, refora o conceito de avaliao preguiosa, em que nada calculado at que seja efetivamente necessrio.Main> 18 Main> 18 Main> 18 Main> 18 Main> 18 (f_currificada 3) 4 5 6 ((f_currificada 3) 4) 5 6 (((f_currificada 3) 4) 5) 6 ((((f_currificada 3) 4) 5) 6) f_nao_currificada (3, 4, 5, 6)

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.6 4 Ghezzi Jazayeri Observaes importantes

Funo Currificada 2.2.3 Princpios da programao funcionalf_nao_currificada (x,y,z,w) = x + y + z + w f_currificada x y z w = x + y + z + w

na avaliao preguiosa, transformaes abstratas intermedirias foram adiadas, at que a disponibilidade dos termos numricos fosse necessria na expresso.

A execuo de programas funcionais 5 6baseada Main> f_currificada 3 4 Em outras palavras, 18 sobre dois mecanismos fundamentais:Main> 18 Main> 18 Main> 18 Main> 18 Main> 18 (f_currificada 3) 4 5 6 ((f_currificada 3) 4) 5 6 (((f_currificada 3) 4) 5) 6 ((((f_currificada 3) 4) 5) 6) f_nao_currificada (3, 4, 5, 6)

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.6 5 Ghezzi Jazayeri Observaes importantes

Funo Currificada 2.2.3 Princpios da programao funcionalf_nao_currificada (x,y,z,w) = x + y + z + w f_currificada x y z w = x + y + z + w

A execuo de programas funcionais baseada A associatividade esquerda observada e para o sobre dois mecanismos fundamentais:caso de 4 argumentos em uma funo f, note que: f a b c d = ( f a ) b c d = ( ( f a ) b ) c d = ( ( ( f a ) b ) c) d Uma generalizao para n argumentos inferida. Em outras palavras, toda funo aplicada ao seu primeiro argumento, sua direita, depois, o resultado desta expresso avaliada aplicada ao segundo argumento, e, assim, sucessivamente, at o ltimo argumento na funo. Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.6 6 Ghezzi Jazayeri Observaes importantes

Funo Currificada 2.2.3 Princpios da programao funcionalf_nao_currificada (x,y,z,w) = x + y + z + w f_currificada x y z w = x + y + z + w

equivalente em uma notao prefixada, pelas razes anteriores, que, em Haskell, pode ser escrita, como a seguir: f_currif_2 x y z w = (+)((+)((+) x y) z) w

A execuo de programas funcionais baseada Finalmente, a funo f_currificada tem uma sobre dois mecanismos fundamentais:

Execuo para f_currif_2 3 4 5 6 na pag. seguinte

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.6 7 Ghezzi Jazayeri

Funo Currificada 2.2.3 Princpios da programao funcional

Execuo da funo equivalente em uma notao prfixa f_currif_2 x y z w = (+)((+)((+) x y) z) w

A execuo de programas funcionais baseada sobre dois mecanismos fundamentais: Main> f_currif_2 3 4 5 618 Main> ((((f_currif_2 3) 4) 5) 6) 18

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.6 8 Funcional Recurso Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

A induo matemtica apropriada para olhar a recurso A induo matemtica proporciona uma propagao tpica da recursividade Induo Matemtica uma definio generalizada para um conjunto de objetos com uma propriedade comum

2.2. Linguagens de Programao Funcional

Recurso

Induo uma definio generalizada para um conjunto de objetos com uma propriedade comum

2.2.2 Haskell

2.2.69 2.2.6 9

Deve-se conhecer o caso trivial, geralmente, para n=0, n=1, que so os valoresbase ou triviais O passo seguinte demonstrar que, para um n genrico, a propriedade indutiva mantm-se desde n-1 Ento, para o termo n essa propriedade indutiva permanece vlida, considerando que em n-1 era verdadeira

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional

Recurso

Induo uma definio generalizada para um conjunto de objetos com uma propriedade comum

2.2.2 Haskell

2.2.70

O conceito dessa idia de induo a base de toda a programao em Haskell, mas esses passos matemticos so deixados a cargo do computadorPara esses clculos, uma propagao que comea de n construda do fim para o incio, at o caso trivial dessa regra recursivaHaskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell Funcional Recurso

Exemplo clssico de recurso, por meio de uma idia indutiva

2.2.7 1

Soma dos n primeiros inteiros.1 + 2 + 3 + ... + (n-1) + n, representado por soma (n) soma (5) = 1 + 2 + 3 + 4 + 5 = 15

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell Funcional Recurso

2.2.7 2

Raciocnio p/ soma dos n primeiros inteiros 1+ 2 + 3 + 4 + ... + n

soma 1 = 1 soma 2 = (soma 1) + 2 soma 3 = (soma 2) + 3 soma 4 = (soma 3) + 4

...

vale para n-1, ento, vale para n

soma n = (soma (n-1)) + n ento soma (n) = 1 :n=1 soma (n-1) + n : n > 1

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.73 2.2.7 3 Funcional Recurso 1 :n=1 soma (n) = soma (n-1) + n : n > 1 Observa-se uma soma repetitiva entre o ltimo nmero com a soma acumulada at o nmero antecessor regra indutiva geral: soma n = soma (n-1) + n aterramento (ltima ao da funo): soma 1 = 1 O cdigo em Haskell fica ento, como a seguir: soma 1 = 1 soma n = soma (n-1) + n Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.7 Funcional Recurso Outro exemplo clssico de recurso 4 o fatorial de um nmero inteiro.

raciocnio para fatorial de n:fatorial 0 = 1 fatorial 1 = (fatorial 0) * 1 fatorial 2 = (fatorial 1) * 2 fatorial 3 = (fatorial 2) * 3

...

fatorial n = (fatorial (n-1)) * n 1 :n=0 fatorial (n-1) * n : n u 1 Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva ento fatorial (n) =

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.7 5 Funcional Recurso 1 :n=0 fatorial (n) = fatorial (n-1) * n : n > 1 Observa-se um produto repetitivo entre o ltimo nmero com o produto at o nmero antecessor.

regra indutiva geral: fatorial n = fatorial (n-1) * n aterramento (ltima ao da funo): fatorial 0 = 1 O cdigo em Haskell fica ento, como a seguir: fatorial 0 = 1 fatorial n = fatorial (n-1) * n Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell Funcional

Cuidados com a Recurso

2.2.7 6

O aterramento da funo deve aparecer antes da chamada da funo recursiva geral. Cuidado: caso se inverta, ocorre uma seqncia infinita de chamadas. regra indutiva geral: fatorial n = fatorial (n-1) * n aterramento (ltima ao da funo): fatorial 0 = 1 O cdigo em Haskell fica ento, como a seguir: fatorial 0 = 1 fatorial n = fatorial (n-1) * n Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell Funcional

Uso de guardas | para aterramento e regra geral

2.2.7 7

Uma guarda uma condio lgica para que a definio da funo seja executada As guardas podem ser montadas, como ao lado:

funo arg1 arg2 ... |guarda_1 = expresso_1 |guarda_2 = expresso_2 ... |otherwise = expresso_n

Nessa montagem, uma funo pode possuir: m args, n guardas c/ suas respectivas expresses, e um otherwise, que abrange as demais condies possveis mas no declaradas. Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell Funcional Exemplo com e sem uso de guarda, para a especificao de uma funo que retorna quantos mltiplos de 7 h em x (no intervalo de 0 a n):

2.2.7 8

multi_7 7 = 1 COM multi_7 x |(x>=0) && (x=0) && (x=0) && (x Bool dia_descanso dia_descanso Sab = True definida por uma srie dia_descanso Dom = True de casos. Dependendo do valor, dia_descanso _ = False

1

2

Pelo ex, vimos que h dois efeitos: 1) O argumento amarrado ao padro quando h casamento; 2) a ao escolhida, baseada no argumento.

3 A varivel amarrada (arg) pode serusada no mapeamento.

no argumento com o qual a funo invocada, o caso apropriado ser selecionado. Os casos so verificados seqencialmente , do primeiro em diante.

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell Funcional CASAMENTO DE PADRES multi_7 multi_7 multi_7 multi_7 multi_7 multi_7 multi_7 multi_7 multi_7 0 1 2 3 4 5 6 7 x = = = = = = = = =

2.2.8 3

0 0 multi_7 7 = 1 0 multi_7 x |(x>=0) && (x Main> Main> Main> Main> Main> Main> Main> f 7 8 9 10 f 17 8 9 20 f 17 18 9 30 f 17 18 19 0 Main> Main> Main> Main> Main> Main> Main> Main> g 7 8 9 10 g 17 8 9 20 g 17 18 9 30 g 17 18 19 0 Main> Main> Main> Main> Main> Main> Main> Main> h 7 8 9 10 h 17 8 9 20 h 17 18 9 30 h 17 18 19 0

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.8 f x y z g 7 y z = 10 h 7 _ _ = 10 7 Funcional | (x == 7) = 10 g x 8 z = 20 h _ 8 _ = 20 | (y == 8) = 20 g x y 9 = 30 h _ _ 9 = 30 | (z == 9) = 30 g x y z | h _ _ _ = 0 | otherwise = 0 (x /= 7)|| f, g e h so (y/= 8) || Pq, as execues, (z /= 9) = 0 equivalentes abaixo, f, g e h com 7 8 9 por causa da associatividade esquerda resultam em 10 ? na currificaoMain> Main> Main> Main> Main> Main> Main> Main> f 7 8 9 10 f 17 8 9 20 f 17 18 9 30 f 17 18 19 0 Main> Main> Main> Main> Main> Main> Main> Main> g 7 8 9 10 g 17 8 9 20 g 17 18 9 30 g 17 18 19 0 Main> Main> Main> Main> Main> Main> Main> Main> h 7 8 9 10 h 17 8 9 20 h 17 18 9 30 h 17 18 19 0

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell Funcional

Tipos Compostos com Tuplas

2.2.8 8

Novos tipos podem ser construdos com o uso da funo type pr-definida em Haskell. Lembra typedef em C.

Exemplo: uma tupla contendo as estaes climticas

type Cadeia = String -cadeia caracteres type Nomes_4 = (Cadeia,Cadeia,Cadeia,Cadeia) f_nomes_estacao :: Nomes_4f_nomes_estacao=(Inverno,Outono,Primavera,Verao)

selec_inverno selec_outono selec_prima selec_verao

(x,_,_,_) (_,x,_,_) (_,_,x,_) (_,_,_,x)

= = = =

x x x x

As funes genricas de seleo empregaram casamento de padro com var. annima

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.8 9 Funcional Tipos Compostos com As funes de seleo Tuplas empregaram casamento de Observar que: padro com var. annima Cadeia empregou String, Nomes_4 empregou Cadeia, e f_nomes_estacao empregou Nomes_4 type Cadeia = String -cadeia caracteres type Nomes_4 = (Cadeia,Cadeia,Cadeia,Cadeia) f_nomes_estacao :: Nomes_4f_nomes_estacao=(Inverno,Outono,Primavera,Verao)

selec_inverno(x,_,_,_)= x Funes genricas, selec_outono (_,x,_,_)= x sem assinatura, selec_prima (_,_,x,_)= x tipo ser inferido, selec_verao (_,_,_,x)= x no argumento, na hora da aplicao Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell Funcional Tipos Compostos com Tuplas selec_inverno(x,_,_,_)= selec_outono (_,x,_,_)= selec_prima (_,_,x,_)= selec_verao (_,_,_,x)= Main> f_nomes_estacao(Inverno,Outono,Primavera,Verao)

2.2.9 0

f_nomes_estacao=(Inverno,Outono,Primavera,Verao)

x x x x Execues com as funes definidas acima

Main> selec_inverno f_nomes_estacao Inverno Main> selec_verao f_nomes_estacao Verao

Main> selec_outono (Joo,Pedro,Augusto,Marcio)

Pedro Abordagem Prtica Claudio C. S e Mrcio F. da Silva Haskell Uma A ltima execuo deve-se a funes genricas

2.2. Linguagens de Programao Funcional 2.2.2 Haskell Tipos Funcional Compostos com Tuplas Novos tipos podem ser construdos com o uso da funo type pr-definida em Haskell. Lembra typedef em C.

2.2.9 1

type Peso = Float type Idade = Int type Pessoa = (String, Idade, Peso, String)

Exemplo: uma tupla contendo campos com tipos diferentes (lembra struct em C): nome, idade, peso e esporte favorito.

f_joao, f_maria :: Pessoa - assinatura p/lista de funes

f_joao = (Joao Carlos, 21, 67.543,Volei) f_maria = (Maria Lucia,23,52.759, Tenis)

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell Tipos Funcional Compostos com Tuplas Observar que Peso empregou Float Idade empregou Int Pessoa empregou um tupla c/ String, Idade, Peso e String

2.2.9 2

f_joao e f_maria so funes constantes, que iniciam contedos s suas tuplas.

type Peso = Float type Idade = Int type Pessoa = (String, Idade, Peso, String)f_joao, f_maria :: Pessoa - assinatura p/lista de funes

f_joao = (Joao Carlos, 21, 67.543,Volei) f_maria = (Maria Lucia,23,52.759, Tenis)

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell Tipos Compostos com Tuplas Funcional

2.2.9 3

Funes que extraem ou relacionam partes de uma tupla so especificadas usando casamento de padres, realizado, pela seleo do campo desejado na tupla de 4, de modo que a mesma tenha um tipo compatvel com o que foi definido nesta funo. f_joao, f_maria :: Pessoa - assinatura p/lista de funes

f_joao = (Joao Carlos, 21, 67.543,Volei) f_maria = (Maria Lucia,23,52.759, Tenis) selec_nome :: Pessoa -> String selec_idade :: Pessoa -> Idade assinaturas selec_peso :: Pessoa -> Peso selec_esporte :: Pessoa -> String selec_nome (n,i,p,e) = n selec_idade (n,i,p,e) = i mapeamentos selec_peso (n,i,p,e) = p selec_esporte (n,i,p,e) Claudio C. S e Mrcio F. da Silva Haskell Uma Abordagem Prtica = e

2.2. Linguagens de Programao Funcional 2.2.2 Haskellcom2.2.9 Execues as 4 Funcional Tipos Compostos com Tuplas novas funesf_joao, f_maria :: Pessoa - assinatura p/lista de funes f_joao = (Joao Carlos, 21, 67.543,Volei) f_maria = (Maria Lucia,23,52.759, Tenis) selec_nome :: Pessoa -> String selec_idade :: Pessoa -> Idade selec_peso :: Pessoa -> Peso selec_esporte :: Pessoa -> String Main> f_joao (Joao Carlos, 21, 67.543,Volei) Main> f_maria (Maria Lucia,23,52.759, Tenis) Main> selec_nome f_joao Joao Carlos selec_nome (n,i,p,e) = n selec_idade (n,i,p,e) = i selec_peso (n,i,p,e) = p selec_esporte (n,i,p,e) = e Main> selec_peso f_maria 52.759 Main> selec_idade f_joao 21 Main> selec_esporte f_maria Tenis

Main>selec_esporte(Luis Paulo,23,70.345, Surf) Surf

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. LinguagensLembrando de Programao Funcional 2.2.2 Haskell 2.2.9 Listas 5 Ghezzi Jazayeri Lista Princpios da programao funcional 2.2.3 uma estrutura de dados que representa uma coleo de objetos homogneos em seqncia

A execuo de programas funcionais baseada Lista permite que os seus elementos sejam sobre dois mecanismos fundamentais:consultados, alterados, includos em uma posio desejada, ou removidos. O acesso a um elemento da lista para qualquer operao acima, conta sempre com o seu cabealho. A partir do cabealho, os elementos podem ser percorridos seqencialmente at o alcance desejado. As vezes, como forma de melhorar o desempenho, pode-se utilizar outros apontadores, alm do cabealho, o corrente (ltimo acessado), anterior, posterior e o ltimo.

2.2. LinguagensLembrando de Programao Funcional 2.2.2 Haskell 2.2.9 Listas 6 Ghezzi Jazayeri Em Haskell, a lista considerada como tendo duas 2.2.3 Princpios da programao funcional partes: a cabea (head) e o rabo (tail).

A execuo de programas funcionais baseada A cabea da lista sempre o primeiro elemento. sobre dois mecanismos fundamentais: Por meio desse primeiro elemento feito o acessoaos elementos restantes da lista.

[a,b,c,d] - se esses so os elementos de uma lista, a cabea o elemento a, o primeiro da lista.A notao de listas uma seqncia de elementos, separados por vrgula e delimitados por [ ]. Uma lista pode no conter elementos, assim, a lista considerada vazia [ ]. Exemplos na pgina seguinte.

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.9 7 Ghezzi Jazayeri Ex. de listas com elementos homogneos

Listas 2.2.3 Princpios da programao funcional

Letras::[Char] --lista de caracteres Letras = [x,a,y,b] Inteiros::[Int] --lista de inteiros Inteiros = [7, 32, 9, 64] Booleanos::[Bool] -lista de booleanos Booleanos = [False, True, False, True] Tuplas::[(Int, Char)] -lista de tuplas Tuplas=[(4,x),(35,z),(99,t)] Listas::[[Char]] -lista de listas Listas=[Maria,[a,x,b,y]]Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.9 Principais funes pr-definidas para listas 8 Ghezzi Jazayeri

2.2.3 Princpios da programao funcional Operador : inclui um elemento no incio da lista :Prelude> 0:[1,2] [0,1,2] Prelude> 5:[1,2,3,4] [5,1,2,3,4]Para construir uma lista, basta simplesmente usar o operador : e a lista inicialmente vazia [ ] :

Prelude> 5:1:2:3:4:[] [5,1,2,3,4]Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.9 9 Ghezzi Jazayeri

Tratando lista e o operador ::

Todas as funes que tratam listas exercem uma ao recursiva sobre ela prpria. Em cada passo n, invocada uma chamada ao sucessor n-1, e esta sucesso de passos feita com o uso do operador : : que opera sobre o argumento lista, separando sua cabea do seu tail (resto)Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.1 00 Ghezzi Jazayeri Notas para o caso geral de funes recursivas complementadas para o caso de listas 1- Enquanto a chamada funo no encontrar a sua definio de parada (aterramento), ela segue empilhando as instncias pendentes em uma pilha virtual de chamadas sobre tal funo. 2- No momento em que a funo encontra um critrio de parada (aterramento), ela considerada bem sucedida e com um valor instanciado. A partir desse ponto, vai sucedendo-se o desempilhamento de cada chamada pendente, com o valor retornado, sendo empregado no ponto da expresso em que houve a chamada. Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.1 01 Ghezzi Jazayeri Notas para o caso geral de funes recursivas complementadas para o caso de listas 3- A cada chamada recursiva, h uma nova instncia de ativao, e um casamento de padro definido para o argumento da funo. Tais argumentos definem o padro de como deve se dar o casamento. Como existe apenas um operador intrnseco lista, o separador : causa, : no argumento lista, a sua separao, em duas partes: a sua cabea, na esquerda, e uma nova sublista (tail), na direita. Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.1 02 Ghezzi Jazayeri Notas para o caso geral de funes recursivas complementadas para o caso de listas 4- A ao de separar a cabea da lista do tail (resto) tambm conhecida pelos termos: escalpelar ou decapitar a lista. Esta separao da cabea da lista faz parte de todos os procedimentos recursivos, a fim de que se possa acessar qualquer outro elemento da lista, no momento que chegue a sua vez de ser a cabea da lista.

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.103 2.2.1 03 Ghezzi Jazayeri Validao de uma estrutura do tipo lista As listas autodefinem-se com o conceito clssico de listas com os seguintes axiomas: 1- Uma lista vazia uma lista 2- Uma sublista tambm uma lista Estas definies so recorrentes e validam se uma estrutura do tipo lista. A definio de que uma sublista uma lista, depende da definio primria ou base, de que uma lista vazia uma lista. Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.104 2.2.1 04 Ghezzi Jazayeri Reescrevendo em Haskell as seguintes definies: 1- Uma lista vazia uma lista 2- Uma sublista tambm uma lista lista[ ] = True -- funo 1 lista (a:x) = lista x -- funo 2 A varivel a, neste caso, a cabea da lista, e, quanto a x, representa o corpo da lista. A funo 1 utiliza um padro que casa somente com a lista vazia, que o final da recurso, depois de todos os elementos terem sido decapitados, na condio de cabea da lista. Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.105 2.2.1 05 Ghezzi Jazayeri Reescrevendo em Haskell as seguintes definies: 1- Uma lista vazia uma lista 2- Uma sublista tambm uma lista lista[ ] = True -- funo 1 lista (a:x) = lista x -- funo 2 A funo 2 casa com qualquer estrutura que use o operador : , quer dizer, : qualquer lista de no mnimo um elemento. Por exemplo, a lista [1,2,3,4] pode ser reescrita pela expresso 1:(2:(3:(4:[]))), e, a partir desta, os possveis casamentos de padro ocorrem. Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.1 06 Execues de aplicaes, empregando lista Jazayeri Ghezzi lista[ ] = True -- funo 1 lista (a:x) = lista x -- funo 2 Main> lista [1,2,3,4] True Main> lista [a] True Main> lista [a,1,2] tipos ERROR Cannot infer instance { *** Instance : Num Char *** Expression : lista [a,1,2] Main> lista [2,4,[6,8]] ERROR Cannot infer instance tipos { *** Instance : Num [a] *** Expression : lista [2,4,[6,8]] Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell Funo que devolve o comprimento de uma lista 2.2.1 07 Ghezzi Jazayeri 2.2.3 Princpios da lista vazia zero funcional 1- O comprimento da programao 2- O comprimento de uma lista (a:x) dada por 1 + o comprimento da sublista x 3- a varivel a a cabea da lista e x representa o corpo (resto) da lista

compto [] = 0 -- funo 1 compto (a:x) = 1 + compto x - funo 2

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.108 Funo que devolve o comprimento de uma lista

compto [] = 0 --funo 1 compto (a:x) = 1 + compto x -funo 2A funo 2 define a recurso, em que a cada passo, a cabea da lista separada, somado 1 e novamente chamada compto com o novo tail (resto) obtido da lista, que novamente, na nova chamada vai ter sua cabea separada, somado +1 e resubmetido o novo tail da lista. A funo 1 faz parar a recurso a varivel a a cabea da lista e x representa o tail (resto) da lista Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.1 Funo que obtm os n primeiros elementos de 1 09 Ghezzi Jazayeri lista Construda com uma estratgia que utiliza casamento de padro possui duas condies de parada e uma regra primeiros 0 = [] geral recursiva. primeiros _ [] = [] primeiros n (a:x) = a : primeiros (n-1) x Na regra geral , acontecem n recurses, cada uma tirando uma cabea, para formar a lista resultante. Main> primeiros 2 [2] Na volta da recurso, [2] Main> primeiros 2 [2,3,4] concatenando cada cabea com a sublista [2,3] retornada. Main> primeiros 7 [] [] Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.1 Funo que verifica se um objeto pertence lista 10 Ghezzi Jazayeri pertence p [] = False pertence p (a:x) | p == a = True | otherwise = pertence p x A recurso prossegue at que: 1) a lista tenha se resumido a uma lista vazia [ ], devido a decapitao em cada passo da sublista de entrada, retornando False; 2)o objeto seja encontrado na lista, retornando True. Main> pertence 1 [1,2,3] True Main> pertence 1 [3,2,3] False Main> pertence 1 [] False Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.1 Funo que insere um objeto na lista, sem 11 Ghezzi repeties, i.e, se j existir, ento, no insere. Jazayeri Para que esse critrio seja seguido, o objeto inserido no final da lista, para que possam ser verificados todos os elementos da lista. insere c [] = [c] insere c (a:x) | c == a = a:x | otherwise = a : insere c xA recurso prossegue at que: 1) a lista tenha se resumido a uma lista vazia [ ], quando retorna [c], uma lista com um objeto, o argumento c. 2) o argumento c coincida com uma cabea a de uma sublista, retornando ento a lista resultante da concatenao de a com a sublista x. 3)Em todas as voltas, cada cabea a volta a fazer parte da lista, pela concatenao com a lista retornada da chamada.

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell Testando a funo que insere um objeto na lista, 2.2.1 12 sem repeties, i.e, se j existir, ento, noGhezzi Jazayeri insere. Para que esse critrio seja seguido, o objeto inserido no final da lista, para que possam ser verificados todos os elementos da lista. insere c [] = [c] insere c (a:x) | c == a = a:x | otherwise = a : insere c x Main> insere 4 [1,2,3] [1,2,3,4] Main> insere 2 [1,2,3] [1,2,3] Main> insere 9 [1,2,3] [1,2,3,9] Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagensdevolve o elemento de maiorHaskell 2.2.1 Funo que de Programao Funcional 2.2.2 valor 13 Ghezzi Jazayeri So apresentadas trs verses equivalentes maior_1 [a] = a maior_1 (a:x)= if (a > (maior_1 x)) then a else (maior_1 x)Decapita duas cabeas, 1 e 2 elementos aeb

maior_2 [a] = a maior_2 (a:b:x)|a > b = maior_2(a:x) |otherwise = maior_2(b:x) maior_3 [a] = a maior_3 (a:x)| a > (maior_3 x) = a |otherwise = (maior_3 x)

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagensordena uma lista 2.2.1 Funo que de Programao Funcional 2.2.2 Haskell 14 Ghezzi Jazayeri So empregadas duas funes: 1)menor devolve o menor elemento de uma lista; 2)remove_menor, devolve uma lista sem o menor menor [a] = a menor (a:c)|a < (menor c) = a |otherwise = menor c remove_menor[a] = [] remove_menor(a:c)|a ==(menor(a:c))= c |otherwise = a:remove_menor c ordena_lista[] = [] ordena_lista [a] = [a] ordena_lista l = (menor l):(ordena_lista(remove_menor l)) Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.115 Algumas funes pr-definidas para listas Ghezzi Jazayeri

2.2.3 Princpios da duas listas programao funcional Operador == compararPrelude> [1,2,3] == (1:2:3:[]) True

Alm de mostrar que possvel comparar duas listas, vemos que as duas formas de representar uma lista so equivalentes.

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.1 Principais funes pr-definidas para listas 16 Ghezzi Jazayeri

2.2.3 Princpios da programao funcional length - comprimento de uma listaLista vazia [] tem comprimento zero.

Lista (a : x) dada por 1 mais o comprimento da sublista x, que tambm uma lista.

Prelude> length [2,7,3,5,4] 5

Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell

Principais funes pr-definidas para listas

2.2.1 17

2.2.3 Princpios da programao funcional ++ - concatena duas listasPrelude> [2,7,3,5,4] ++ [6,8] [2,7,3,5,4,6,8] head primeiro elemento cabea da lista Prelude> head [2,7,3,5,4] 2 last ltimo elemento da lista Prelude> last [2,7,3,5,4] 4Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva

2.2. Linguagens de Programao Funcional 2.2.2 Haskell 2.2.1 Principais funes pr-definidas para listas 18 Ghezzi Jazayeri tail devolve uma lista sem o primeirofuncional 2.2.3 Princpios da programao elemento Prelude> tail [2,7,3,5,4] [7,3,5,4]

init lista sem o ltimo elementoPrelude> init [2,7,3,5,4] [2,7,3,5]

null verifica se a lista est ou no vaziaPrelude> null [2,7,3,5,4] False Prelude> null [] www.dpi.inpe.br/cursos/cap365/funcional.ppt True

2.2.119 2.2. Linguagens de Programao Funcional 2.2.2 Haskell Ghezzi Jazayeri Principais funes pr-definidas para listas

reverse devolve da programao funcional 2.2.3 Princpios o reverso da listaPrelude> reverse [2,7,3,5,4] [4,5,3,7,2]

take pega os n primeiros elementos da listaPrelude> take 3 [2,7,3,5,4] [2,7,3]

drop apaga os n primeiros elementos da listaPrelude> drop 2 [2,7,3,5,4] [3,5,4] Haskell Uma Abordagem Prtica Claudio C. S e Mrcio F. da Silva