我有一个字符串"AB0123456789"
,我想要的输出是:"AB01 2345 6789"
...我想在每四个字符后添加一个空格。我怎么能这样做?
Main> addSpace "AB0123456789"
"AB01 2345 6789"
答案 0 :(得分:13)
使用Data.List.intercalate
和Data.List.Split.chunksOf
这很容易:
import Data.List.Split
addSpace :: String -> String
addSpace = intercalate " " . chunksOf 4
答案 1 :(得分:4)
我认为模式匹配会使这最简单:
addSpaces :: String -> String
addSpaces xs@(_:_:_:_:[]) = xs
addSpaces (a:b:c:d:xs) = a:b:c:d:' ':addSpaces xs
addSpaces xs = xs
你必须包括第一个案例,这样你才不会在最后获得一个空间,但它非常简单。但这不是可扩展的,你不能使用这样的函数来动态选择在插入空格之前要跳过多少个字符(例如在@ cdk的答案中)
答案 2 :(得分:2)
这可能不是最有效的:
addSpace xs = if length xs <= 4
then xs
else take 4 xs ++ " " ++ addSpace (drop 4 xs)
ghci中的演示:
ghci > addSpace "AB0123456789"
"AB01 2345 6789"
答案 3 :(得分:1)
您可以使用splitAt
。这是一个在每个第n个字符后添加空格的函数。
spaceN :: Int -> String -> String
spaceN n = init . go
where go [] = []
go xs = let (as, bs) = splitAt n xs in as ++ (' ' : go bs)
针对您的具体案例:
λ. spaceN 4 "AB0123456789"
"AB01 2345 6789"
答案 4 :(得分:1)
window :: Int -> [a] -> [[a]]
window i = unfoldr (\l -> if null l then Nothing else Just (splitAt i l))
addSpace :: String -> String
addSpace = intercalate " " . window 4