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
String 具有字符列表的Haskell递归_String_List_Haskell_Recursion_Character - Fatal编程技术网

String 具有字符列表的Haskell递归

String 具有字符列表的Haskell递归,string,list,haskell,recursion,character,String,List,Haskell,Recursion,Character,我正在学习哈斯克尔,有件事发生了,我坚持了几天。。所以我基本上是在尝试通过字符(字符串)的列表递归,一旦它到达字符串的末尾,有没有一种方法可以让我再次从头部递归通过列表 下面是一段代码,用于在字符串中递归一次 repeat2' :: [Char] -> Int -> [Char] repeat2' [] _ = undefined repeat2' (x:xs) 1 = [x] repeat2' (x:xs) k | (k > 0) = x: repeat2' xs(k

我正在学习哈斯克尔,有件事发生了,我坚持了几天。。所以我基本上是在尝试通过字符(字符串)的列表递归,一旦它到达字符串的末尾,有没有一种方法可以让我再次从头部递归通过列表

下面是一段代码,用于在字符串中递归一次

repeat2' :: [Char] -> Int -> [Char]
repeat2' [] _ = undefined
repeat2' (x:xs) 1 = [x]
repeat2' (x:xs) k
    | (k > 0) = x: repeat2' xs(k-1)
它适用于

重复2“嘿”1=“h”

重复2“嘿”2=“他”

重复2“嘿”3=“嘿”

但一旦我尝试

重复2'“嘿”4=“嘿***例外:前奏。未定义”

因为它将“repeat2'[].=未定义”

但我想把它打印出来

重复2“嘿”4=“嘿”

那我怎么才能回到弦的顶端呢


谢谢你的帮助

让我给方程贴上标签,以便以后参考

   repeat2' :: [Char] -> Int -> [Char]
1) repeat2' [] _ = undefined
2) repeat2' (x:xs) 1 = [x]
   repeat2' (x:xs) k
3)     | (k > 0) = x: repeat2' xs(k-1)
让我们追踪一下
repeat2'“hey”4
的减少情况。首先,我将把字符串分解成一个列表

repeat2' ['h', 'e', 'y'] 4
然后将列表放入其cons单元格中

repeat2' ('h':'e':'y':[]) 4
现在我们可以开始了

repeat2' ('h':'e':'y':[]) 4
-- equation 3 applies, x = 'h', xs = 'e':'y':[], k = 4
'h' : repeat2' ('e':'y':[]) 3
-- the first element of the result is known now, so it is printed by the repl
-- equation 3 applies ot the remainder
'h' : 'e' : repeat2' ('y':[]) 2
-- e is now known and printed
-- equation 3 applies
'h' : 'e' : 'y' : repeat2' [] 1 
-- y is known and printed
-- equation 1 applies
'h' : 'e' : 'y' : undefined
-- the repl errors out because of undefined
从而解释了输出

"hey***Exception: Prelude.undefined
我希望这能帮助你理解


一个问题是,为了循环列表,您需要保留它以进行递归调用。请注意,当我们打印h,e,y时,下一步使用的信息已不存在。除了要遍历的列表外,您还需要将该列表原封不动地传递出去。

这是您的家庭作业吗?因为在过去的几天里,你的两个同学可能会提出几乎相同的要求;)(他们两人刚刚在这里注册)顺便说一句:这将是
未定义的
,因为你告诉你的函数在你的第一个案例中就是这样的-我也给你和你的同学一样的提示:你可能想把
x
放在某个地方,在那里进一步调用
repeat2'
可能会再次找到它。。。进一步提示:您可以使用
x:…
x
预先添加到列表中。。。也许你知道一些可以附加它的东西…是的,这是哈哈,除了我不要求答案;只是想法和建议;另外,我不太明白你所说的“把它放在某个地方以备进一步通话”。我对这种语言很陌生,不知道你会怎么做。。我不知道如何传递字符串从头部开始!好吧,至少另一位一开始就这么说了(你看:通常我们处理家庭作业的问题有点不同——就像卢基那样)——对于你的问题,我给了你另一个提示(但你应该再次阅读第一个提示):你的
“嘿”4
问题从
开始1
左侧-如果它位于
“h”1
或甚至
“hey”1
(也请参见luqui的提示)-不考虑性能,如果您以
“eyh”结尾,您就可以达到这一点,这不是很好吗“3
第二次递归调用-现在如何从列表的开始到结束获取
h
?哦,好的,我知道了;但是,是的,我不得不再次传递字符串来浏览列表。。。我尝试过做“(k/=0)=x:repeat2'x:xs(k-1)”,如果有一个带有“k”的空列表还有更多的字符需要处理,那么再次传递字符串以从头开始,除非它仍然不起作用..我只是想不出其他方法..有更多提示吗?最简单的方法是再次传递字符串(或记住它)如果您通过多个参数来扩展函数,例如:
repeat list(x:xs)k=…
,然后以
repeat“hey”“hey”4