2

我希望能够将一个字符串拆分为每个字符的 6 个单独的字符串。

例如 IAMABADPROGRAMMER

将导致:IDA、APM、MRM、AOE、BGR、AR

有没有一个haskell函数来做到这一点?

谢谢

4

2 回答 2

3

还没有一个函数可以做到这一点,但它可以很容易地编写:

import Data.List (transpose)

chunk :: Int -> [a] -> [[a]]
chunk _ [] = []
chunk n xs = first : chunk n rest where (first, rest) = splitAt n xs

splitSkip :: Int -> [a] -> [[a]]
splitSkip n xs = transpose $ chunk n xs

main :: IO ()
main = print $ splitSkip 6 "IAMABADPROGRAMMER"

我的第一个直觉是将其推广到所有列表,而不仅仅是Chars 的列表。当您记得类型[String]与​​ 相同时[[Char]],您会看到最终得到一个Chars 的二维矩阵,如果您从左到右向下遍历每一列,您将得到原始列表。好吧,这与转置矩阵并从上到下逐行向下移动相同,这与n首先将原始列表拆分为元素块相同。在这一点上,我有解决方案,只是向后工作。我写了一个快速函数来分块列表,然后使用transpose函数 fromData.List完成它。

于 2013-10-09T14:47:43.537 回答
2

我确信这可以通过列表推导来完成,除了 Prelude 中的基本功能之外什么都没有......

    groupNth :: Int -> [a] -> [[a]]
    groupNth n [] = []
    groupNth n xs = take n $ [ y | y <- everyNth xs ] : groupNth n (tail xs)
            where
            everyNth [] = []
            everyNth l@(y:ys) = y : everyNth (drop n l)

似乎有效,我认为比使用转置更有效。

于 2013-10-09T16:41:06.473 回答