Questão 38: menor
Voltar
Apresente uma definição recursiva da função menor :: String -> String -> Bool
que dadas duas strings, retorna True se e só se a primeira for menor do que a segunda, segundo a ordem lexicográfica (i.e., do dicionário).
Exemplo
> menor "sai" "saiu"
True
> menor "programacao" "funcional"
False
Resolução
menor :: String -> String -> Bool
menor _ "" = False
menor "" _ = True
menor (h:t) (h':t')
| h < h' = True
| h == h' = menor t t'
| otherwise = False
Explicação
Os sinais de <
e >
, quando aplicados a caracteres, permitem-nos compará-los em termos de ordem lexicográfica (ordem em que aparecem no dicionário), assumindo que são ambos minúsculos ou maiúsculos. Por exemplo, 'c' < 'p' == True
e 'a' > 'd' == False
. Desta forma, para definir esta função, apenas precisamos de comparar o primeiro caracter de cada uma das strings. Se o primeiro caracter da primeira string for menor que o da segunda, a string toda será menor, e podemos devolver True
. Se forem iguais, teremos de comparar os segundos caracteres, e se estes também forem iguais continuamos a percorrer as strings até encontrar uma diferença. Caso nenhuma destas coisas se verifique, a segunda string é maior do que a primeira, e podemos devolver False
.