我正在尝试编写
形式的函数f :: String -> [String]
f str = ...
返回通过从str
中删除一个字符而形成的所有字符串的列表。例如:
ghci> f "stack"
["tack","sack","stck","stak","stac"]
因为String
和[Char]
是同义词,我可以使用索引,但我知道你应该避免在Haskell中这样做。除了使用索引之外还有更好的方法吗?
答案 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
但实际上,它比其他解决方案慢。