[Haskell-cafe] Unfoldr love

Justin Bailey jgbailey at gmail.com
Thu Oct 25 18:52:47 EDT 2007

In my best Homer Simposon voice - "unfoldr - is there anything it can't do?"

I have strange unfoldr love right now. I'm probably too impressed by
this function, but it takes a string and splits it into a list of
words, while keeping "quoted" phrases together:

    import Data.List

    phrasesAndWords :: String -> [String]
    phrasesAndWords =
      let startsWith w c = [c] `isPrefixOf` w
          endsWith w c = [c] `isSuffixOf` w
          buildPhrases [] = Nothing
          buildPhrases (w:ws)
            | w `startsWith` '"' = -- A word starts with a '"', now
look for ending '"'
                let (p, rest) = break (`endsWith` '"') (w:ws)
                  case () of
                    () | null p -> Just ((init . tail) w, ws) --
single word in quotes
                       | null rest -> Just ((tail . unwords) p, rest)
-- No ending quote
                       -- Some amount of words in the phrase and some not
                       | otherwise -> Just ((init . tail) (unwords (p
++ [head rest])), tail rest)
            | otherwise = Just (w, ws)
        -- Use of words makes sure any valid quotes appear at beginning or
        -- end of a word.
        unfoldr buildPhrases . words

Of course it's not a full parser (no nested quotes or escaping) but
who would think unfoldr could do that?


p.s. Style comments, improvements welcome.

More information about the Haskell-Cafe mailing list