String Haskell,将列表拆分为指定的块,导致无限循环
如何阻止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
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是的,它是。无论如何,你应该给我们一个输入和预期输出的例子。IOWx
应该是y
。我想你错过了函数的基本情况。这是因为它是一个递归函数,对吗?我只需要知道如何让它停止,一旦字符串被分组到带有警告的chunksCompile中,它将显示您的错误(请参阅未使用的变量)。@MikeNoelHiggs是的,它是。无论如何,你应该给我们一个输入和预期输出的示例。IOWx
应该是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处截断列表(作为字符串的其余部分)这是正确的吗?