我希望能够将每个字符串分成6个单独的字符串。
例如IAMABADPROGRAMMER
将导致:IDA,APM,MRM,AOE,BGR,AR
是否有haskell功能来执行此操作?
由于
答案 0 :(得分:2)
没有功能可以做到,但可以很容易地写出来:
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"
我的第一个直觉是将此概括为所有列表,而不仅仅是Char
的列表。当您记住类型[String]
与[[Char]]
相同时,您会看到最终得到Char
s的二维矩阵,如果您将每列向左下移到 - 好的,你会得到原来的清单。嗯,这与转置矩阵并从上到下每行向下相同,这与首先将原始列表拆分为n
元素的块相同。在这一点上,我有了解决方案,只是向后工作。我写了一个快速函数来分块列表,然后使用transpose
中的Data.List
函数来完成它。
答案 1 :(得分: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)
似乎工作,我认为比使用转置更有效。