【问题标题】:How to group a string into strings of length four?如何将字符串分组为长度为 4 的字符串?
【发布时间】:2011-03-04 22:25:30
【问题描述】:

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

让我们调用执行这个任务的函数lsi,这样lsi "aaaaaaabbb"的结果 是["aaaa", "aaa", "bbb"]。我曾尝试使用以下函数来实现lsi,但它不会将字符串切成四个字符。

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

【问题讨论】:

    标签: haskell


    【解决方案1】:
    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"]
    

    如果你还不熟悉HooglegroupconcatMap,我建议你。

    【讨论】:

    • splitAt 可以用来代替(take, drop),所以如果你使用{-# LANGUAGE ViewPatterns #-},你会得到漂亮的chop _ [] = []; chop n (splitAt n -> (h, t)) = h : chop n t
    • @ephemient sweet,我不知道那个编译指示。 Data.Sequence 视图方法现在更有意义了:)
    【解决方案2】:

    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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多