haskell aula5 f.ordem-sup_modulos-cifra_cesar

28
Programação Funcional em Haskell 5a Reunião —Módulos, Função de Ordem Superior, Desafio: cifra de césar

Upload: crislanio-macedo

Post on 26-Jul-2015

29 views

Category:

Technology


0 download

TRANSCRIPT

Programação Funcional em Haskell5a Reunião —Módulos, Função de Ordem Superior, Desafio: cifra de césar

Conteúdo e objetivos

Introdução à programação funcional usando Haskell Objetivos de aprendizagem

Importando Módulos;

Fundamentos sobre funções de ordem superior;

Seção desafio : cifra de césar em haskell;

Cadeias em compreensão

Como as cadeias são listas, também podemos usar notaçãoem compreensão com cadeias de carateres.

Exemplo: contar letras minúsculas.

minusculas :: String -> Intminusculas txt = length [c | c<-txt, c>='a' && c<='z']

Processamento de listas e de carateres

Muitas funções especializadas estão pré-definidas emmódulos.Para utilizar um módulo devemos importar as suas definições.

Processamento de listas e de carateres: (cont.)

Exemplo: o módulo Data.Char define operações sobrecaracteres.

import Data.Charminusculas :: String -> Intminusculas cs = length [c | c<-cs, isLower c]-- isLower :: Char -> Bool-- testar se um carater é uma letra minúscula

Processamento de listas e de carateres: (cont.)

Um outro exemplo: converter cadeias de carateres emmaiúsculas.

import Data.CharstringUpper :: String -> StringstringUpper cs = [toUpper c | c<-cs]-- toUpper :: Char -> Char-- converter letras em maiúsculas

Mais informação

Podemos usar o GHCi para listar todos os nomes definidosnum módulo:

Prelude> import Data.CharPrelude Data.Char> :browse

Seção desafio: O módulo Data.Char

Vamos usar algumas funções sobre caracteres definidas nomódulo Data.Char, .:

ord :: Char -> Int — código numérico dum caracterchr :: Int -> Char — caracter dum código numérico

Para usar este módulo, colocamos a seguinte declaração noprograma:

import Data.Char

Função de Ordem Superior

Uma função é de ordem superior se tem um argumento que éuma função ou um resultado que é uma função.

Exemplo: o primeiro argumento de twice é uma função.

twice :: (a -> a) -> a -> atwice f x = f (f x)

A função map

A função map aplica uma função a cada elemento duma lista.

map :: (a -> b) -> [a] -> [b]

Exemplos:

> map (+1) [1,3,5,7][2,4,6,8]

> map isLower "Hello!"[False,True,True,True,True,False]

A função filterA função filter seleciona os elementos duma lista quesatisfazem um predicado (isto é, uma função cujo resultado éum valor boleano).

filter :: (a -> Bool) -> [a] -> [a]

Exemplos:

> filter even [1..10][2,4,6,8,10]

> filter isLower "Hello, world!""elloworld"

Funções takeWhile e dropWhile

takeWhile seleciona o maior prefixo duma lista cujos elementosverificam um predicado.

dropWhile remove o maior prefixo cujos elementos verificamum predicado.

As duas funções têm o mesmo tipo:

takeWhile, dropWhile :: (a -> Bool) -> [a] -> [a]

Funções takeWhile e dropWhile (cont.)

Exemplos:

> takeWhile isLetter "Hello, world!""Hello“

> dropWhile isLetter "Hello, world!"", world!"

> takeWhile (\n -> n*n<10) [1..5][1,2,3]

> dropWhile (\n -> n*n<10) [1..5][4,5]

As funções all e anyall verifica se um predicado é verdadeiro para todos oselementos duma lista.

any verifica se um predicado é verdadeiro para algumelemento duma lista.

As duas funções têm o mesmo tipo:

all, any :: (a -> Bool) -> [a] -> Boll

As funções all e any (cont.)

Exemplos:

> all even [2,4,6,8]True

> any odd [2,4,6,8]False

> all isLower "Hello, world!"False

> any isLower "Hello, world!"True

As funções all e any (cont.)

Podemos definir all e any usando map, and e or:

all p xs = and (map p xs)

any p xs = or (map p xs)

A função fold r l

A função foldr transforma uma lista usando uma operaçãoassociada à direita (“fold right”):

foldr () v [x1; x2; : : : ; xn] = x1 (x2 (: : : (xn v) : : :))

Existe outra função foldl que transforma uma lista usando umaoperação associada à esquerda (“fold left”):

foldl () v [x1; x2; : : : ; xn] = ((: : : ((v x1) x2) : : :) xn)

A função foldr (cont.)

sum = foldr (+) 0

product = foldr (*) 1

and = foldr (&&) True

or = foldr (||) False

length = foldr (\x n->n+1) 0

A função foldr (cont.)

sum [1,2,3,4]=foldr (+) 0 [1,2,3,4]=foldr (+) 0 (1:(2:(3:(4:[]))))=1+(2+(3+(4+0)))=10

A função foldr (cont.)

Outro exemplo:

product [1,2,3,4]=foldr (*) 1 [1,2,3,4]=foldr (*) 1 (1:(2:(3:(4:[]))))=1*(2*(3*(4*1)))=24

A função foldl

Se f for associativa e z elemento neutro, então foldr f z efoldl f z dão o mesmo resultado.

sum = foldl (+) 0 sum = foldr (+) 0

sum [1,2,3,4] sum [1,2,3,4]= = foldl (+) 0 [1,2,3,4] foldr (+) 0 [1,2,3,4]= =(((0+1)+2)+3)+4 1+(2+(3+(4+0)))= =10 10

Outras funções de ordem superior

A função (.) é a composição de duas funções.

(.) :: (b -> c) -> (a -> b) -> a -> cf . g = \x -> f (g x)

Exemplo

par :: Int -> Boolpar x = x`mod`2 == 0

impar :: Int -> Boolimpar = not . Par

Outras funções de ordem superior

A composição permite muitas vezes simplificar definiçõesembricadas, omitido os parêntesis e o argumento.

Exemplo:

f xs = sum (map (^2) (filter par xs))

é equivalente a

f = sum . map (^2) . filter par

Seção desafio: a cifra de césar

• Um dos métodos mais simples para codificar um texto.

• Cada letra é substituída pela que dita k posições noalfabeto.

• Quando ultrapassa a letra ’z’, volta à letra ’a’.

• Utilizada pelo imperador Júlio César (100 AC–44 AC).

Seção desafio: a cifra de césar

Exemplo: para k = 3, a substituição é:

a b c d e f g h i j k l m n o p q r s t u v w x y z d e f g h i j k l m n o p q r s t u v w x y z a b c

Logo, “ataque” é codificado como “dwdtxh”. “Elizete” é codificado como “Eolchhw”. “Davi Sena ” é codificado como “Gdyl vhqd”. “Darlan ” é codificado como “Gduodq”.

Seção desafio: a cifra de césar

Fazer em haskell um programa que simule a cifra de césar !

Resolução Próximo Encontro.

Bibliografia

Haskell - Uma abordagem prática. Cláudio César de Sá eMárcio Ferreira da Silva. Novatec, 2006.

http://en.wikipedia.org/wiki/Fold_(higher-order_function).

Agradecimentos

Ao Prof°- Ricardo Reis e a todos os participantes do projeto haskell ufc.