Haskell 递归模式匹配,输出问题

Haskell 递归模式匹配,输出问题,haskell,Haskell,我正在尝试使用模式匹配和递归将列表中的一些单词替换为其他单词。模式匹配并非在所有情况下都有效,并且我的代码不会在所有情况下生成使用模式匹配更改的字符串列表 我想知道是否有人能帮我找出原因 pattr :: [[Char]] -> [[Char]] pattr [] = [] pattr ("you":as) = ("u":pattr as) pattr ("see":"you":as) = ("seaya":pattr as) pattr ("by":"the":"way":as) = (

我正在尝试使用模式匹配和递归将列表中的一些单词替换为其他单词。模式匹配并非在所有情况下都有效,并且我的代码不会在所有情况下生成使用模式匹配更改的字符串列表

我想知道是否有人能帮我找出原因

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"]

在上一个案例中,您没有重复出现。因此,如果列表中的第一个单词与任何模式都不匹配,它只会停止,而不会检查列表中后面出现的单词。

最后一个案例中没有重复出现。因此,如果列表中的第一个单词与任何模式都不匹配,它只会停止,不检查列表中后面的单词。

似乎您只需要更改最后一行:

pattr (x:as) = (x: pattr as)

似乎您只需要更改最后一行:

pattr (x:as) = (x: pattr as)

非常感谢。我没听清楚,递归对我来说有点新。我仍在掌握窍门;)非常感谢。我没听清楚,递归对我来说有点新。我仍在掌握窍门;)您可以将括号放在右侧,例如
pattr(“You”:as)=“u”:pattr as
。在左侧,它需要加括号才能成为单个patternmatched参数,但在右侧,它只是一个表达式,无论是否加括号,都不会改变值。此外,更常见的是查看
(x:xs)
,而不是
(x:as)
。第一种形式意味着
x
只是许多相似元素中的第一个(因此
xs
只是
x
的复数形式),而第二种形式意味着
x
与列表中的其他元素有所不同,后者似乎由许多
a
组成,例如,
pattr(“您”:as)=“u”:pattr as
。在左侧,它需要加括号才能成为单个patternmatched参数,但在右侧,它只是一个表达式,无论是否加括号,都不会改变值。此外,更常见的是查看
(x:xs)
,而不是
(x:as)
。第一种形式意味着
x
只是许多类似元素中的第一个(因此
xs
只是
x
的复数),而第二种形式意味着
x
与列表中的其他元素有所不同,后者似乎由许多
a
组成。