Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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 Haskell,将列表拆分为指定的块,导致无限循环_String_Haskell_Split_Char_Chunks - Fatal编程技术网

String Haskell,将列表拆分为指定的块,导致无限循环

String Haskell,将列表拆分为指定的块,导致无限循环,string,haskell,split,char,chunks,String,Haskell,Split,Char,Chunks,如何阻止Haskell执行无穷大函数 splitList i "" = [] splitList i str = let (x, y) = splitAt i str in x : splitList i x 尝试在GHCi中逐步实施: Prelude> i = 2 Prelude> str = "HelloWorld" Prelude> let (x, y) = splitAt i str Prelude> x "He" Prel

如何阻止Haskell执行无穷大函数

splitList i ""  = []
splitList i str = let (x, y) = splitAt i str
                  in x : splitList i x

尝试在GHCi中逐步实施:

Prelude> i = 2
Prelude> str = "HelloWorld"
Prelude> let (x, y) = splitAt i str
Prelude> x
"He"
Prelude> y
"lloWorld"
在下一步中,
splitList
使用
i
x
递归调用自身,其中
x
“He”


在第三遍中,
splitList
再次使用
i
x
递归调用自身。请注意,
x
在第一次调用和第二次调用之间没有变化。您现在看到无限递归了吗?

尝试在GHCi中逐步实现:

Prelude> i = 2
Prelude> str = "HelloWorld"
Prelude> let (x, y) = splitAt i str
Prelude> x
"He"
Prelude> y
"lloWorld"
在下一步中,
splitList
使用
i
x
递归调用自身,其中
x
“He”


在第三遍中,
splitList
再次使用
i
x
递归调用自身。请注意,
x
在第一次调用和第二次调用之间没有变化。你现在看到无限递归了吗?

我想你错过了函数的基本情况。这是因为它是一个递归函数,对吗?我只需要知道如何让它停止,一旦字符串被分组到带有警告的chunksCompile中,它将显示您的错误(请参阅未使用的变量)。@MikeNoelHiggs是的,它是。无论如何,你应该给我们一个输入和预期输出的例子。IOW
x
应该是
y
。我想你错过了函数的基本情况。这是因为它是一个递归函数,对吗?我只需要知道如何让它停止,一旦字符串被分组到带有警告的chunksCompile中,它将显示您的错误(请参阅未使用的变量)。@MikeNoelHiggs是的,它是。无论如何,你应该给我们一个输入和预期输出的示例。IOW
x
应该是
y
。是的,你能帮我解决这个问题吗?我只是真的很困惑,我应该在哪里使用尾部,或者如何在一段时间后更新xpass@MikeNoelHiggs从你最近的提问历史来看,你似乎在学习Haskell。太好了!你通过自己做练习学习的效果最好,所以虽然我很乐意帮助你把事情弄清楚,并且自己教你如何解决问题,但如果我给你答案,你不会学到任何东西。不过,如果你还停留在问题的其他部分,欢迎你问另一个问题。那样的话,你能告诉我一个更苗条的问题吗?据我所知,尾部(y)没有被使用,因为它只是一遍又一遍地调用x(head),但是我不知道如何在x分组后切换到尾部:/@mikenoolhiggs:
y
不是尾部。请注意,我们使用元组(
(x,y)
)进行模式匹配,而不是列表cons
(x:y)
。已解决的
splitList i”“=[]splitList i str=let(x,y)=splitAt i str in x:splitList i y
基本上,我是在每次递归后在x处而不是在y处截断列表(作为字符串的其余部分)这对吗?是的,你能帮我修一下吗?我只是真的很困惑,我应该在哪里使用尾部,或者如何在一段时间后更新xpass@MikeNoelHiggs从你最近的提问历史来看,你似乎在学习Haskell。太好了!你通过自己做练习学习的效果最好,所以虽然我很乐意帮助你把事情弄清楚,并且自己教你如何解决问题,但如果我给你答案,你不会学到任何东西。不过,如果你还停留在问题的其他部分,欢迎你问另一个问题。那样的话,你能告诉我一个更苗条的问题吗?据我所知,尾部(y)没有被使用,因为它只是一遍又一遍地调用x(head),但是我不知道如何在x分组后切换到尾部:/@mikenoolhiggs:
y
不是尾部。请注意,我们使用元组(
(x,y)
)进行模式匹配,而不是列表cons
(x:y)
。已解决的
splitList i”“=[]splitList i str=let(x,y)=splitAt i str in x:splitList i y
基本上,我是在每次递归后在x处而不是在y处截断列表(作为字符串的其余部分)这是正确的吗?