Free Palestine and Lebanon 🍉 Stop the Genocide
Haskell Logo

Programação Funcional

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

Clica para revelar

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

Clica para revelar

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.