2015-05-19 91 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