Questão 4: Escreva uma função recursiva converte em Haskell que receba uma String s e retorne uma nova String t com todos os caracteres alfabéticos maiúsculos de s convertidos em minúsculos, conforme o exemplo:
> converte "JessicA DESLUMBRANTE!!"
"jessica deslumbrante!!"
> converte "amora"
"amora"

Passo 1

Primeiro, vamos entender o que a questão pede: criar uma função recursiva em Haskell que recebe uma String e devolve outra String convertendo apenas os caracteres alfabéticos maiúsculos em minúsculos, mantendo os demais caracteres iguais. Precisamos usar recursão e pattern matching em listas de caracteres. Para transformar o código numérico de um Char em outro, vamos usar as funções ord e chr do módulo Data.Char.

Passo 2

Definimos a assinatura de tipo da função: converte :: String -> String. Em Haskell, String é sinônimo de [Char], então a função vai tratar uma string como uma lista de caracteres.

Passo 3

No caso base, quando a lista de caracteres é vazia ([]), simplesmente retornamos []: converte [] = [].

Passo 4

No caso recursivo, fazemos pattern matching em (x:xs). Para cada caractere x, checamos se ele é uma letra maiúscula com o guard ‘A’ <= x && x <= ‘Z’. Se x for maiúsculo, convertemos usando chr (ord x - ord ‘A’ + ord ‘a’) para calcular o caractere minúsculo correspondente, e então chamamos converte recursivamente sobre xs. Se x não for maiúsculo, mantemos x inalterado e chamamos converte recursivamente sobre xs.

Passo 5

Juntando todas as partes, obtemos a definição completa da função.

Resposta

import Data.Char (ord, chr)
converte :: String -> String
converte [] = []
converte (x:xs)
| ‘A’ <= x && x <= ‘Z’ = chr (ord x - ord ‘A’ + ord ‘a’) : converte xs
| otherwise = x : converte xs

Exercícios relacionados