Haskell从String中删除Chars

时间:2014-11-14 18:36:12

标签: string haskell char

我正在尝试编写

形式的函数
f :: String -> [String]
f str = ...

返回通过从str中删除一个字符而形成的所有字符串的列表。例如:

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

因为String[Char]是同义词,我可以使用索引,但我知道你应该避免在Haskell中这样做。除了使用索引之外还有更好的方法吗?

3 个答案:

答案 0 :(得分:7)

您可以像这样使用递归:

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

答案 1 :(得分:0)

Josh Kirklin 的解决方案是单线:

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

答案 2 :(得分:0)

可能更容易理解的方式是:

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

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

但实际上,它比其他解决方案慢。