2013-02-12 97 views
0

我想用模式匹配和遞歸來替換列表中的某些單詞與其他單詞。模式匹配在所有情況下都不起作用,並且在任何情況下,我的代碼都不會生成更改的字符串列表,使用模式匹配。遞歸模式匹配,輸出問題

我想知道是否有人可以幫助我確定這是爲什麼?

pattr :: [[Char]] -> [[Char]] 
pattr [] = [] 
pattr ("you":as) = ("u":pattr as) 
pattr ("see":"you":as) = ("seaya":pattr as) 
pattr ("by":"the":"way":as) = ("btw":pattr as) 
pattr ("laugh":"out":"loud":as) = ("lol":pattr as) 
pattr ("for":"your":"information":as) = ("fyi":pattr as) 
pattr (x:as) = (x:as) 

例子:

GHCi> pattr ["milk", "see", "you", "soon"] 
> ["milk", "see", "you", "soon"] 
GHCi> pattr ["see", "you", "soon"] 
> ["cya", "soon"] 
+0

你可以拖放到右側的括號,例如'pattr(「you」:as)=「u」:pattr as'。在左側,它需要被括起來作爲單個模式匹配的參數,但是在右側它只是一個表達式,並且不管是否用括號括起來都不會改變值。另外,通常會看到'(x:xs)'而不是'(x:as)'。第一種形式意味着'x'只是許多類似元素中的第一個(所以'xs'只是'x'的複數形式),而第二種形式暗示'x'與列表中的其餘部分有某些區別,似乎是由許多'a'組成的。 – Boris 2013-02-12 15:41:58

回答

2

看來你只需要改變的最後一行:

pattr (x:as) = (x: pattr as) 
+0

謝謝!沒有注意到,遞歸有點新。我仍然掌握着它;) – AnchovyLegend 2013-02-12 15:09:52

2

你不能在你的最後一種情況下遞歸。因此,如果列表中的第一個單詞與任何模式都不匹配,它就會停止並且不會檢查列表中稍後出現的單詞。