如何将字符串转换为长度不超过4的重复字符列表?我创建了一个函数,将String的长度减少到4,我称之为chop
,但我需要一个函数将字符串分成重复字符列表,然后使用chop
。
让我们调用执行此任务的函数lsi
,以便lsi "aaaaaaabbb"
的结果
是["aaaa", "aaa", "bbb"]
。我已尝试使用以下函数来实现lsi
,但它不会将字符串缩减为四个字符。
run [] = []
run (x:xs) = (x : takeWhile (==x) xs)
答案 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
只需将group
和concatMap
与chop 4
合并即可。
ghci> lsi "aaaaaabbbbbccc"
["aaaa","aa","bbbb","b","ccc"]
如果您还不熟悉,我建议您Hoogle group
和concatMap
。
答案 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"