Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何将字符串拆分为长度为3的字符串列表?_String_Haskell - Fatal编程技术网

String 如何将字符串拆分为长度为3的字符串列表?

String 如何将字符串拆分为长度为3的字符串列表?,string,haskell,String,Haskell,遇到了一个问题,如果我想将诸如“qwertyzxc”(9个元素)(['q'、'w'、'e'、'r'、't'、'y'、'z'、'x'、'c'])之类的字符列表拆分为长度为3的字符串列表。我该怎么做? 例如: 输入:['q'、'w'、'e'、'r'、't'、'y'、'z'、'x'、'c'] 输出:[['q'、'w'、'e']、['r'、't'、'y']、['z'、'x'、'c'] 谢谢,我已经在这上面呆了很长时间了如果段长度固定为3,那么您可以通过模式匹配执行以下操作 segment :: [a]

遇到了一个问题,如果我想将诸如“qwertyzxc”(9个元素)(
['q'、'w'、'e'、'r'、't'、'y'、'z'、'x'、'c'])之类的字符列表拆分为长度为3的字符串列表。我该怎么做?
例如:

输入:
['q'、'w'、'e'、'r'、't'、'y'、'z'、'x'、'c']
输出:
[['q'、'w'、'e']、['r'、't'、'y']、['z'、'x'、'c']


谢谢,我已经在这上面呆了很长时间了

如果段长度固定为3,那么您可以通过模式匹配执行以下操作

segment :: [a] -> [[a]]
segment []           = []
segment [x]          = [[x]]
segment [x,y]        = [[x,y]]
segment (x:y:z:rest) = [x,y,z] : segment rest

*Main> segment [1,2,3,4,5,6,7,8,9]
[[1,2,3],[4,5,6],[7,8,9]]

或者您也可以尝试此方法,免费检查长度:

segment :: [a] -> [[a]]
segment [a,b,c,d,e,f,g,h,i] = [[a,b,c],[d,e,f],[g,h,i]]
segment           _         = error "the list hasn't 9 items"
然后你尝试:

> segment [1,2,3,4,5,6,7,8,9]
[[1,2,3],[4,5,6],[7,8,9]]

正如您可能注意到的,您可以使用Data.List.Split中的chunksOf轻松地将其转换为更通用的
pN

注释中引用了预先打包的答案,但需要安装

import Data.List.Split(chunksOf)
chunksOf::Int->[e]->[[e]]
--样本使用
3个“HelloWorld”的块==[“Hel”、“loW”、“orl”、“d”]
定义自定义函数,仅前奏曲 我编写的此函数与chunksOf完全相同,但不需要安装任何软件包:

splitInto::Int->String->[String]
拆分为n=foldl(fn)[“”]
哪里
f::Int->[String]->Char->[String]
f n s x
|(n>)$length$last s=init s++[last s++[x]]
|否则=s++[[x]]

它可能会被优化为使用
而不是
++
,但如果性能不受关注,这是可行的。此外,它还可以泛化为字符串以外的任何内容。

如果列表不能被三除怎么办?输入的大小总是九。这只是它的使用方式。如果它不是9,我想它会给您一条错误消息,告诉您它的大小不正确。Data.List.Split.chunksOfMy GHCI返回*Main>[“.3.2.6…”、“9..3.5..1”、“.18.64…”、“.81.29…”、“7..8”、“.67.82…”、“.26.95…”、“8..2.3..9”、“.5.1.3..]。你知道为什么它使用“””而不是“[”?因为字符串是字符列表,而Show实例被定义为将字符列表显示为字符串。@Zarolan,字符串是字符列表。ghci通常将列表显示为
'h':'o':'l':'a':[]
作为
“hola”“
我喜欢这个解决方案,使用回归和归纳也非常简洁!
> segment [1,2,3,4,5,6,7,8]
*** Exception: the list hasn't 9 items
p3::[a] -> [[a]]
p3 [] = []
p3 l = take 3 l : (p3 $ drop 3 l)