haskell aula5 f.ordem-sup_modulos-cifra_cesar
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).