Vous pouvez utiliser récursion comme les autres réponses démontrent. Mais vous pouvez aussi utiliser des builtins pour construire une telle fonction.
Deux fonctions pertinentes ici sont null :: [a] -> Bool
qui vérifie si une liste est vide, et last :: [a] -> a
qui obtient le dernier élément.
Alors maintenant, nous pouvons construire une fonction:
import Data.Char(isUpper)
checkLast :: [Char] -> Bool
checkLast l = not (null l) && isUpper (last l)
Nous voici donc affirmer que checkLast
est True
si la liste l
n'est pas vide (not (null l)
); et le dernier élément est un caractère majuscule isUpper (last l)
.
Cela sera probablement un peu plus rapide que les fonctions récursives, puisque nous ne testons le cas []
qu'une seule fois (dans null
). last
vérifie seulement deux cas: [x]
et (x:xs)
donc nous économisons sur []
contrôles.
Bien sûr, ces fonctions fonctionnent avec récursion, mais il est parfois utile de chercher des fonctions d'aide telles qu'une fonction est presque auto expliquer: ici les fonctions dit: "Une liste l
est checkLast
si elle est pas vide, et le dernier élément est une majuscule ".
Quelques des choses.** 1 ** 'if isUpper x then True sinon False' est identique à' isUpper x'. ** 2 ** Jetez un second regard sur le cas final. D'où viens-tu? Pourquoi 'x: xs' est-il inutilisé? – SwiftsNamesake