Si vous avez des besoins sérieux en matière de traitement de texte, utilisez la fonction text
paquet de hackage :
> :set -XOverloadedStrings
> import Data.Text
> strip " abc "
"abc"
Si vous êtes trop têtu pour utiliser text
et que vous n'aimez pas l'inefficacité de la méthode inverse, alors peut-être (et je dis bien PEUT-ÊTRE) quelque chose comme la méthode ci-dessous sera plus efficace :
import Data.Char
trim xs = dropSpaceTail "" $ dropWhile isSpace xs
dropSpaceTail maybeStuff "" = ""
dropSpaceTail maybeStuff (x:xs)
| isSpace x = dropSpaceTail (x:maybeStuff) xs
| null maybeStuff = x : dropSpaceTail "" xs
| otherwise = reverse maybeStuff ++ x : dropSpaceTail "" xs
> trim " hello this \t should trim ok.. .I think .. \t "
"hello this \t should trim ok.. .I think .."
J'ai écrit ceci en supposant que la longueur des espaces serait minimale, donc votre O(n) de ++
y reverse
est peu préoccupant. Mais une fois de plus, je ressens le besoin de dire que si vous êtes réellement préoccupé par les performances, alors vous ne devriez pas utiliser le système de gestion de l'information. String
du tout - passer à Text
.
EDIT pour illustrer mon propos, un rapide benchmark Criterion m'indique que (pour une chaîne de mots particulièrement longue avec des espaces et ~200 espaces avant et après) mon découpage prend 1,6 ms, le découpage utilisant la marche arrière prend 3,5 ms, et Data.Text.strip
prend 0.0016 ms...