2013-02-12 3 views
0

Я пытаюсь использовать сопоставление и рекурсию для замены некоторых слов в списке другими словами. Совпадение шаблонов не работает во всех случаях, и мой код не создает список строк, измененных с использованием сопоставления шаблонов во всех случаях.Рекурсия Pattern Matching, проблема с выпуском

Мне было интересно, может ли кто-нибудь помочь мне определить, почему это так?

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' как-то отличается от остальной части списка, что казалось бы, состоял из множества «а». – Boris

ответ

2

кажется, что вам нужно всего лишь заменить последнюю строку:

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

Спасибо! Не поймал это, рекурсия немного новая. Я все еще чувствую это;) – AnchovyLegend

2

Вы не рекурсии в последнем случае. Поэтому, если первое слово в вашем списке не соответствует ни одному из шаблонов, оно просто останавливается и не проверяет слова, которые появляются позже в списке.