Если у вас есть серьезные потребности в обработке текста, используйте пакет 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 мс ...