Je sais que c'est un vieux post, mais je n'ai vu aucune solution qui implémente le bon vieux fold
.
Supprimez d'abord les espaces blancs de tête en utilisant dropWhile
. Ensuite, en utilisant foldl'
et d'une simple fermeture, vous pouvez analyser le reste de la chaîne en une seule fois et, sur la base de cette analyse, transmettre ce paramètre informatif à la commande take
sans avoir besoin de reverse
:
import Data.Char (isSpace)
import Data.List (foldl')
trim :: String -> String
trim s = let
s' = dropWhile isSpace s
trim' = foldl'
(\(c,w) x -> if isSpace x then (c,w+1)
else (c+w+1,0)) (0,0) s'
in
take (fst trim') s'
Variable c
garde la trace des espaces blancs et non blancs combinés qui devraient être absorbés, et les variables w
garde la trace de l'espace blanc du côté droit qui doit être supprimé.
Test Runs :
print $ trim " a b c "
print $ trim " ab c "
print $ trim " abc "
print $ trim "abc"
print $ trim "a bc "
Sortie :
"a b c"
"ab c"
"abc"
"abc"
"a bc"