r.sendecky
r.sendecky

Reputation: 10363

Haskell: String splitting. Learning algo

I've seen the other threads about missing split function but I didn't want to peek as I do this for learning purposes and want to figure out myself. So here it is:

split :: Char -> String -> [String]
split c xs | null f = []
           | otherwise = f : split c s'
  where (f,s) = break (== c) xs
        s' | null s = s
           | otherwise = tail s

It seems to work fine (please tell me if anything is wrong with it) but when I use a splitting character that is not in the string then the function returns a list with a single element of the original string whereas I want it to return an empty list. I can't figure out how to do it.

Any ideas?.

Upvotes: 1

Views: 206

Answers (1)

Landei
Landei

Reputation: 54584

You can simply write a wrapper function, changing the result of your original one:

split' x xs = go (split x xs)  where
   go [_] = []
   go ys = ys

There are many ways to write a split function, e.g.

split x xs = foldl' go [[]] xs where
   go (ys:yss) y | y == x = []:ys:yss
                 | otherwise = (y:ys):yss    

or

 import Data.List 

 split x xs = map tail $ groupBy (const (/=x)) (x:xs)

Upvotes: 1

Related Questions