Você está na página 1de 6

2 Lista de Exerccios de Paradigmas de Linguagens Computacionais Professores: Fernando Castor, Paulo Borba e Mrcio Cornlio Monitores: Cincia da Computao:

Alberto Rodrigues Costa Junior (arcj), Jssica de Carvalho Barbalho (jcb), Luana Martins dos Santos (lms7) Engenharia da Computao: Bruno Gomes Correia Rodrigues (bgcr), Felipe de Souza Araujo (fsa2), Jefferson Luis Alves de Medeiros (jlam) CIn-UFPE-2012.2 Disponvel desde: 19/01/2012 Entrega: 01/02/2013 A lista dever ser respondida em dupla. A falha em entregar a lista at a data estipulada implicar na perda de 0,25 ponto na mdia da disciplina para os membros da dupla. Considerase que uma lista na qual menos que 8 das respostas esto corretas no foi entregue. A entrega da lista com pelo menos 12 das questes corretamente respondidas implica em um acrscimo de 0,125 ponto na mdia da disciplina para os membros da dupla. Se qualquer situao de cpia de respostas for identificada, os membros de todas as duplas envolvidas perdero 0,5 ponto na mdia da disciplina. O mesmo vale para respostas obtidas a partir da Internet. As respostas devero ser entregues exclusivamente em formato texto ASCII (nada de .pdf, .doc, .docx ou .odt) e devero ser enviadas para o monitor responsvel por sua dupla, sem cpia para o professor. Devem ser organizadas em arquivos separados, um por questo, entregues em um nico formato compactado, ou seja, um nico arquivo zipado contendo as respostas para todas as questes. Se voc ainda no fez isso, v at a pgina da monitoria da disciplina (http://goo.gl/BUEn4 ou http://goo.gl/IldMn) e coloque os nomes dos membros da sua dupla abaixo do nome do monitor que tem menos duplas at o momento. 1) Considere os seguintes tipos sinnimos: Lado = Float Triangulo = (Lado, Lado, Lado) Implemente uma funo que recebe uma lista de Triangulo e retorna a soma das reas dos respectivos tringulos. Use obrigatoriamente as funes foldr1 e map. 2) Dado as composies de funes abaixo, diga para cada uma delas, se possvel fazer a composio e o porque ( explicando o passo a passo ) e se no for possvel tambm explique o porque (no passo a passo dizer onde deu/daria errado). a) map.map b) foldl.foldr c) foldr.foldr.filter d) map.map.filter e) map.foldr.map 3) Cria o operador forward composition (>.>) que dado duas funes como parmetro. Ele compe as respectivas funes de forma que o resultado seja igual a aplicao sucedidas dessas funes da esquerda para a direita. (>.>)::(a->b)->(b->c)->(a->c) prelude> ((2*)>.>(+3)>.>(/2)>.>(+7)) 1 9.5

4) Implemente uma funo functions :: [(a -> a -> a)] -> [a] -> [(a -> a)], tal que recebe uma lista de funes binrias, uma lista de valores. O funcionamento de functions tal que aplica cada funo a um respectivo elemento da lista de valores e retorna uma lista de funes parcialmente aplicadas. Inclua alguns exemplos de entrada e respectiva sada para functions, em comentrio no arquivo de resposta. 5) Determine o tipo das funes abaixo mostrando os passos at obter o resultado. Se for preciso, identifique as classes dos parmetros polimrficos. Caso no seja possvel determinar o tipo, explique o porqu. a) ((:).foldr.foldr) (:) b) map.map.foldr c) foldr.foldr.foldl d) foldl.foldr.foldl e) map.(foldr(/2)) 6) Considere uma lista de alunos com seus nomes completos, escreva um programa que retorne a lista de nomes abreviados da seguinte forma: abrev ["Alberto Rodrigues Pontes", "Amanda Azevedo Mendes"] >> ["A. Mendes", "A. Pontes"] Depois de abreviados ordene a lista em ordem alfabtica, utilize funes como map, fold e filter para resolver a questo. 7) Defina um tipo algbrico Temperatura com 3 construtores (Celsius, Fahrenheit e Kelvin) que tero valores (Float) representando temperaturas nas escalas indicadadas. Em seguida, crie instancias de Ord, Eq e Show para Temperatura(leve em conta que TemperaturaCelsius/5 = (TemperaturaFahrenheit-32)/9 = (TemperaturaKelvin-273)/5) depois crie uma funo minMax, que recebe um lista de temperaturas e retorna uma tupla-2 em que o primeiro elemento a menor temperatura da lista e o segundo elemento a maior. 8) A prefeitura de uma cidade quer saber quais dias de um determinado periodo a temperatura na cidade ultrapassou a mdia de temperatura neste mesmo perodo, porem o termmetro da cidade esta desregulado. Crie uma funo mediaTemp que recebe uma lista de (Temperatura,Data) e uma funo de correo de temperatura (Temperatura -> Temperatura) e retorna uma uma lista de (Temperatura,Data) dos dias em que temperatura ultrapassou a mdia. Obs.: Crie um tipo algbrico Data(que indique dia, ms e ano); Utilize o tipo algbrico Temperatura da questo anterior; obrigatrio que voc crie suas prprias funes de alta ordem(map, filter,...). 9) Crie uma tipo algbrico para representar um grafo. Em seguida crie uma classe Buscas, e usando a funo da classe Buscas, faa uma busca em largura no grafo, onde dado o vrtice inicial, o vrtice final, e o grafo. Voc deve retornar "True" se possvel chegar no vrtice final a partir do inicial e "False" caso contrrio. Assinatura da funo => bfs::Int->Int->[Grafo Int]>Bool

10) a)Crie o tipo algbrico (data Arvore a) que representa uma rvore binria. b)Crie uma classe (Box b) com as seguintes definies: mapB::(a->c)->(b a)->(b c) que recebe uma funo de converso e converte de um Box pra outra(equivale ao map de listas). foldPre::(a->a->a)->a->(b a)-> a que recebe uma funo de reduo e reduz uma Box um tipo a ,executando em pr-ordem (equivale ao foldl de listas). foldPos::(a->a->a)->a->(b a)-> a que recebe uma funo de reduo e reduz uma Box um tipo a , executando em pos-ordem (equivale ao foldr de listas). c) Implemente as seguintes instncias : instance (Box []) instance (Box Arvore) instance Show a => Show (Arvore a) instance Eq a => Eq (Arvore a) d)crie uma funo lengthB::(Box b)=>b a->Int que retorne a quantidade de elementos na Box.

11) Nomeie o tipo Measurement, que ser um Double. Crie um tipo Sample t, que possui um atributo [t] (que chamaremos de input) e um atributo t (que chamaremos de output). Crie um tipo Net t, que possui um atributo [[t]], um [t] e uma funo [t] -> [t] -> t. Implemente as seguintes funes: lengthDouble :: [t] -> Double lengthDouble (x:xs) = 1 + (lengthDouble xs) lengthDouble [] = 0 tuplify :: [Sample Double] -> [Double] -> [(Double, Double)] tuplify ((Sample i o):ss) (p:ps) = (o, p):(tuplify ss ps) tuplify [] _ = [] tuplify _ [] = [] rmse :: [Sample Double] -> [Double] -> Double rmse s p | (length s) == (length p) = sqrt ((foldr (+) 0 (map (\(x, y) -> (x-y)**(2)) (tuplify s p))) / ((lengthDouble p))) Crie uma classe Model (m t) com as funes: newModel :: (m t) runModel :: (m t) -> Sample t -> t testModel :: (m t) -> [Sample t] -> [t] trainModel :: (m t) - > [Sample t] - > (m t) Instancie esta classe para Net Double de modo que: newModel deve gerar um novo Net Double com atributos sua escolha; runModel n s deve associar o input de um Sample Double, s, a um Double, tal valor ser em funo apenas do input desse s e do n. testModel n s deve associar o input de cada Sample Double em s a um Double, tal valor ser em funo apenas do input do respectivo Sample Double e do n. trainModel n s: Cada n' obtm um certo rmse s (testModel n' s) trainModel n s deve ajustar os atributos do n a fim de retornar um n' que minimize o resultado da funo rmse s (testModel n' s). Ex.: let s = [Sample [0.14767932489451474,-0.15025906735751293,-0.1923076923076923,0.25,0.36986301369863017,0.14653407429072796,-0.6985462892119358] 0.4482758620689655 , Sample [-0.7805907172995781,0.544041450777202,0.46923076923076934,0.5,0.041095890410958846,-0.21029540801403945,-0.19357306809487385] -1.0] rmse s (testModel newModel s) pode retornar 0.5524851346 enquanto rmse s (testModel (trainModel newModel s) s) pode retornar 0.1200456739 . Brinque de criar novos modelos e instanciar a classe com eles. =D 12) Crie uma Monad que represente uma rvore binria que implemente as trs leis fundamentais das Monads. Explique sua construo.

13) Nomeie um tipo para representar um estado. Crie um tipo ST s a, onde s normalmente ser um estado e a um outro tipo, para representar um transformador de estado, que ser uma funo com um parmetro do tipo s e um retorno do tipo (a, s). Conselho: crie uma funo runST :: (ST s a) -> (s -> (a, s)) que apenas desencapsula a funo dentro do ST. Instancie a classe Monad para o tipo criado, de modo que: return deve receber um parmetro x e retornar um ST que recebe um estado s como parmetro e devolve a tupla (x, s); (>>=) deve receber dois parmetros, um processor do tipo ST s a e outro processorGenerator do tipo (a -> ST s b). (>>=) deve retornar um ST que recebe um estado state0 como parmetro e tem como resultado: Chamando de (out1, state1) o resultado da aplicao da funo em processor sobre state0; Chamando de processor2 o resultado da aplicao de processorGenerator sobre out1; O resultado da aplicao da funo em processor2 sobre state1 retorna primeiro membro da tupla retornada pela funo seja utilizada. Em outras palavras: (processor >>= processorGenerator) s0 deve resultar em uma sada e um estado, tal sada deve ser aplicada a processorGenerator e o ST resultante deve ser aplicado quele estado. Esta Monad obedece as trs leis de Monad? Crie uma funo pseudoRandom que recebe um estado e retorne uma tupla com um inteiro pseudo-aleatrio e um novo estado. Ex.: pseudoRandom 0 pode retornar (-34773803, 1); pseudoRandom 1 pode retornar (46883875, 2). Utilizando pseudoRandom, crie uma funo newPseudoRandom que recebe uma lista de Int e retorne um ST, que, dado um estado, adicione um novo inteiro pseudo-aleatrio cabea da lista e altere tal estado. Utilizando (>>=) e pseudoRandomList, crie uma funo que recebe um inteiro e resulte em um ST, que, dado um estado, retorne uma lista de inteiros pseudo-aleatrios e um outro estado. Ex.: fst ((runST (pseudoRandomList 2)) 0) pode retornar [-34773803, 46883875]. 14) Leia de um arquivo de entrada expresses booleanas e verifique se a expresso obedece a igualdade. Para cada expresso, escreva no arquivo de sada "Sim" caso a expresso obedeca a igualdade e "Nao" caso contrrio ( sem aspas ). O nome do arquivo de entrada e de sada pode ser qualquer um. Lembrando que no arquivo de entrada pode conter mais de uma expresso. Exemplo de uma expresso: "(((f&f)|t)&t) = t", para esse caso deveria escrever no arquivo sim.

15) Toninho um cara muito esperto, cansado de ficar minimizando e maximizando o ghci na hora de corrigir algum erro nas suas questes, resolveu criar as seguintes funes para realizar pequenas alteraes no cdigo sem sair do ghci. printFile::String->IO () -recebe o nome do arquivo e imprime seu contedo na tela. replace::String->String->String->IO() --recebe o nome do arquivo , a string que ser substituda(velha) e a string que ir substituia(nova). Todas ocorrncia de velha no arquivo devem ser substitudas por nova(equivale ao ctrl + h no notepad); Ele gostou tanto da sua ideia que decidiu compartilhar com seu colegas , para tal criou a funo main::IO() 1-pergunta o nome do arquivo 2-imprime o contedo 3-pergunta a string que ser substituda(velha) 4-pergunta a string que ir substituir-la(nova) 5-atualiza o arquivo(Todas ocorrncias de velha no arquivo devem ser substitudas por nova) 6- imprime o arquivo Como toninho gosta de uma gambiarra , seu cdigo ilegvel ento para fins de aprendizado voc decidiu criar as mesmas funes. (dica : se necessrio utilize um arquivo temporrio) -- contedo entrada.hs isPrimos::Int->(Bool) isPrimos n | n<2 =False |otherwise =all (\x-> n`mod` x /= 0) (takeWhile (floor(sqrt(toEnum n)) >= ) primos) primos::[Int] primos = 2:[x |x<-[3 ..],null [y| y<-[2..floor(sqrt(toEnum x))],x `mod` y ==0]] --fim do contedo de entrada.hs prelude>repleace entrada.hs null [y| y<-[2..floor(sqrt(toEnum x))],x `mod` y ==0] isPrimos x -- contedo entrada.hs isPrimos::Int->(Bool) isPrimos n | n<2 =False |otherwise =all (\x-> n`mod` x /= 0) (takeWhile (floor(sqrt(toEnum n)) >= ) primos) primos::[Int] primos = 2:[x |x<-[3 ..],isPrimos x] --fim do contedo de entrada.hs