Search code examples
stringhaskelltrimremoving-whitespace

In Haskell, how do you trim whitespace from the beginning and end of a string?


How do you trim whitespace from the start and end of a string?

trim "  abc " 

=>

"abc"

Edit:

Ok, let me be a little clearer. I did not understand that string literals were treated so differently from Strings.

I would like to do this:

import qualified Data.Text as T
let s :: String = "  abc  "
in T.strip s

Is this possible in Haskell? I am using -XOverloadedStrings but that appears only to work for literals.


Solution

  • If you have serious text processing needs then use the text package from hackage:

    > :set -XOverloadedStrings
    > import Data.Text
    > strip "  abc   "
    "abc"
    

    If you're too stubborn to use text and don't like the inefficiency of the reverse method then perhaps (and I mean MAYBE) something like the below will be more efficient:

    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  .."
    

    I wrote this on the assumption that the length of spaces would be minimal, so your O(n) of ++ and reverse is of little concern. But once again I feel the need to say that if you actually are concerned about the performance then you shouldn't be using String at all - move to Text.

    EDIT making my point, a quick Criterion benchmark tells me that (for a particularly long string of words with spaces and ~200 pre and post spaces) my trim takes 1.6 ms, the trim using reverse takes 3.5ms, and Data.Text.strip takes 0.0016 ms...