繁体   English   中英

字符串在Haskell中的每个字符分为6个部分

[英]String split into 6 parts every character in Haskell

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

例如,IAMABADPROGRAMMER

会导致:IDA,APM,MRM,AOE,BGR,AR

有没有一个haskell功能来做到这一点?

谢谢

没有功能可以做到,但它可以很容易地编写:

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元素的块相同。 在这一点上,我有了解决方案,只是向后工作。 我编写了一个快速函数来分块列表,然后使用Data.Listtranspose函数来完成它。

我确信这可以通过列表推导完成,除了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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM