user3657850
user3657850

Reputation: 552

Haskell delete Chars from String

I'm trying to write a function of the form

f :: String -> [String]
f str = ...

that returns the list of all the strings formed by removing exactly one character from str. For example:

ghci> f "stack"
["tack","sack","stck","stak","stac"]

Because String and [Char] are synonymous, I could use the index, but I know that you should avoid doing that in Haskell. Is there a better way besides using the index?

Upvotes: 1

Views: 4063

Answers (3)

vek
vek

Reputation: 1543

Maybe a more readable way to describe it is:

gaps :: [a] -> [[a]]
gaps xs = zipWith removeAt [0..] $ replicate (length xs) xs

removeAt i xs = ys ++ zs
    where
        (ys,_:zs) = splitAt i xs

But practically, it is slower than the other solutions.

Upvotes: 0

effectfully
effectfully

Reputation: 12715

The Josh Kirklin's solution as a one-liner:

f = tail . foldr (\x ~(r:rs) -> (x : r) : r : map (x :) rs) [[]]

Upvotes: 0

Josh Kirklin
Josh Kirklin

Reputation: 939

You could use recursion like so:

f :: [a] -> [[a]]
f [] = []
f (s:ss) = ss : map (s:) (f ss)

Upvotes: 7

Related Questions