Если у вас есть серьезные потребности в обработке текста, воспользуйтесь пакетом text
от hackage:
> :set -XOverloadedStrings
> import Data.Text
> strip " abc "
"abc"
Если вы слишком упрямы, чтобы использовать text
, и вам не нравится неэффективность обратного метода, то, возможно (и я имею в виду МОЖЕТ БЫТЬ) что-то вроде приведенного ниже будет более эффективным:
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 .."
Я написал это в предположении, что длина пробелов будет минимальной, поэтому ваши O (n) из ++
и reverse
не вызывают особого беспокойства. Но я еще раз чувствую необходимость сказать, что если вас действительно беспокоит производительность, вам вообще не следует использовать String
- перейдите к Text
.
РЕДАКТИРОВАТЬ, подтверждая мою точку зрения, быстрый тест Criterion сообщает мне, что (для особенно длинной строки слов с пробелами и ~ 200 пробелов до и после) моя обрезка занимает 1,6 мс, обрезка с использованием реверса занимает 3,5 мс, а Data.Text.strip
занимает 0,0016 мс. ..
person
Thomas M. DuBuisson
schedule
07.06.2011