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

String 字符串拆分为6部分Haskell中的每个字符,string,haskell,split,String,Haskell,Split,我希望能够将一个字符串拆分为每个字符6个单独的字符串 例如IAMABADPROGRAMMER 将导致:IDA、APM、MRM、AOE、BGR、AR 是否有haskell函数来执行此操作 谢谢现在还没有一个函数可以完成这项工作,但是它可以很容易地编写: 导入数据列表(转置) chunk::Int->[a]->[[a]] 区块[]=[] chunk n xs=first:chunk n rest where(first,rest)=拆分n xs splitSkip::Int->[a]->[[a]]

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

例如IAMABADPROGRAMMER

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

是否有haskell函数来执行此操作


谢谢

现在还没有一个函数可以完成这项工作,但是它可以很容易地编写:

导入数据列表(转置)
chunk::Int->[a]->[[a]]
区块[]=[]
chunk n xs=first:chunk n rest where(first,rest)=拆分n xs
splitSkip::Int->[a]->[[a]]
splitSkip n xs=转置$chunk n xs
main::IO()
main=打印$splitSkip 6“IAMABADPROGRAMMER”

我的第一个直觉是将其推广到所有列表,而不仅仅是
Char
s的列表。当您记住类型
[String]
[[Char]]]
相同时,您会看到最终的2D矩阵是
Char
s,如果您从左向右遍历每一列,您将返回原始列表。好的,这与转换矩阵并从上到下遍历每一行是一样的,这与首先将原始列表拆分为
n
元素块是一样的。在这一点上,我有了解决方案,只是向后工作。我编写了一个快速函数来划分一个列表,然后使用
Data.list
中的
transpose
函数来完成它。

我确信这可以通过列表理解来完成,除了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)
groupNth::Int->[a]->[[a]]
组n[]=[]

groupNth n xs=take n$[y | y,因此您需要一个函数
String->[String]
将每六个字符分组在一起?字符串以6的倍数分开。字符1变为字符串1,字符2变为字符串2等,直到字符6变为字符串6,然后下一个字符7变为字符串1,依此类推,请参见
拆分
包中的
chunksOf
(包含在Haskell平台中),允许您编写
splitSkip n=transpose.chunksOf n
@user2863323作为一项挑战,尝试实现您自己的
splitAt
transpose
(不一定要高效)。
splitAt
非常简单,但
transpose
应该是一项挑战(提示:
map
head
tail
)为了提高效率,我把你的代码和我的代码放在一起,用
+RTS-s-RTS
,以100万整数(
[1..1000000]
)运行它,分成1000块,我的答案大约用了0.24秒,而你的答案大约用了4.6秒。这是20倍的速度差。GC时间和最大内存驻留时间大致相同,但我的使用了大约两倍的堆空间。你可以在这里看到完整的输出->啊,无法击败经验测试;-)你的评论只是让我好奇,到底哪一种效率更高,所以我对它们进行了测试。我不认为我的评论会更慢,但我以前错了很多=)