如何将字符串分组为长度为四的字符串?

时间:2011-03-04 00:11:59

标签: haskell

如何将字符串转换为长度不超过4的重复字符列表?我创建了一个函数,将String的长度减少到4,我称之为chop,但我需要一个函数将字符串分成重复字符列表,然后使用chop

让我们调用执行此任务的函数lsi,以便lsi "aaaaaaabbb"的结果 是["aaaa", "aaa", "bbb"]。我已尝试使用以下函数来实现lsi,但它不会将字符串缩减为四个字符。

run [] = []
run (x:xs) = (x : takeWhile (==x) xs)

2 个答案:

答案 0 :(得分:3)

import Data.List (group)

chop _ [] = []
chop n xs = take n xs : chop n (drop n xs)

lsi :: (Eq a) => [a] -> [[a]]
lsi = concatMap (chop 4) . group

我的印章略有不同。它只是将列表分成列表列表,每个子列表都有给定的最大长度。

ghci> chop 2 "abcdefgh"
["ab","cd","ef","gh"]

之后,lsi只需将groupconcatMapchop 4合并即可。

ghci> lsi "aaaaaabbbbbccc"
["aaaa","aa","bbbb","b","ccc"]

如果您还不熟悉,我建议您Hoogle groupconcatMap

答案 1 :(得分:0)

group功能将您的列表分组为相等元素的块。 对于chop函数,The Haskell Cafe中提到了一个很好的通用实现。

问题的完整解决方案如下所示:

import Data.List (group)

chop :: ([a] -> (b, [a])) ->  [a] ->  [b]
chop _ [] = []
chop f as = b : chop f as'
  where (b, as') = f as

lsi :: String -> [String]
lsi = concat . map (chop $ splitAt 4) . group

main = putStrLn $ show $ lsi "aaaaaaabbb"