2015-05-19 92 views
1

我正在学习Haskell和某些东西出现在我被卡住了几天..所以我基本上试图通过字符列表(字符串)缓存,一旦它达到了字符串,是否有一种方法让我再次从头部递归到列表中?Haskell递归与字符列表

这是通过字符串递归一次的代码。

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

它适用于

repeat2' “嘿” 1 = “H”

repeat2' “嘿” 2 = “他”

repeat2' “嘿” 3 =“哎”

但一旦我尝试

repeat2' “哎” 4 = “哎***例外:Prelude.undefined”

因为它要“repeat2”[] _ = undefined“;

但我想它打印

repeat2' ‘哎’4 =‘heyh’

..所以怎么这样,我回去串的头上?

感谢您的帮助!

+2

我说得对,这是你的功课吗?因为看起来你的两个同学在过去几天可能要求几乎相同;)(他们两个刚刚在这里注册) – Carsten

+0

btw:它会因为4而被定义为'undefined',因为你告诉你的函数是这个与你的第一个案例 - 我也给你同样的提示作为你的同学:而不是放下'x'你可能想把它放在哪里进一步调用'repeat2''可能再次找到它......进一步提示:你可以使用'x:...'将'x'预先加入列表...也许你知道一些可以追加它的东西... – Carsten

+0

是的,它是哈哈,除非我没有要求回答;只是想法和建议;另外我不太明白你所说的“把它放在进一步呼叫的地方”..即时通讯相当新的这种语言,不知道你会怎么做..即时通讯不知道如何通过字符串从头开始! – hello

回答

1

让我给方程添加标签以便稍后参考它们。

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的减少情况。首先,我将desugar串入一个列表

repeat2' ['h', 'e', 'y'] 4 

则列表到它的利弊细胞

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你明白的爱好。

一个问题是,为了循环列表,您需要保留它以进行递归调用。请注意,当我们打印h,e,y时,接下来要使用的信息不再存在。除了你正在遍历的那个之外,你还需要一直沿着这个列表传递这个列表。

+0

噢好吧我看到它是怎么回事,但是,我坚持再次传递字符串以通过列表......我试图做“(k/= 0)= x:repeat2'x: xs(k-1)\t“这里如果有一个空的列表中有”k“的字符仍然有更多的字符要通过,再次传递字符串以从头再次开始,除非它仍然不起作用..我只是c蚂蚁想到其他方式..更多的提示? – hello

+1

最简单的方法是再次传递字符串(或记住它),如果你扩展你的函数多一个参数,比如:'repeat list(x:xs)k = ...',然后用'repeat'开始你的嘿“”嘿“4” – Carsten