我认为您的旧代码没有正确缩进。如果我在以下位置运行 ghc 编译器:
rovarSprak :: [Char] -> [Char] -> [Char]
rovarSprak [] res = res
rovarSprak (c:restOfStr) res
| (checkCons c) == True = rovarSprak restOfStr (c:'o':c:res)
| otherwise = rovarSprak restOfStr (c:res)
它给出了一个错误:
strep.hs:8:1: parse error on input ‘|’
将其重写为:
rovarSprak :: [Char] -> [Char] -> [Char]
rovarSprak [] res = res
rovarSprak (c:restOfStr) res
| (checkCons c) == True = rovarSprak restOfStr (c:'o':c:res)
| otherwise = rovarSprak restOfStr (c:res)
解决编译错误。
另外如果尝试复现,结果是:
"cocboba"
警卫工作正常,您的代码的唯一问题是在递归调用中:
rovarSprak restOfStr (c:'o':c:res)
-- ^push in front
您将结果推送到新列表的前面,而您可能希望它位于尾部。
您可以通过不使用累加器来解决这个问题,而是直接发射元素。例如:
rovarSprak :: [字符] -> [字符]
罗瓦斯普拉克 [] = []
rovarSprak (c:restOfStr)
|
(checkCons c
) == True =
c : 'o' : c : (rovarSprak restOfStr)
|否则 =
c : rovarSprak restOfStr
(粗体字和笔画冗余代码元素的排放)。这也允许生成惰性列表:也许您只对输出的前三个元素感兴趣,或者输入是一个无限列表。
我建议的最后一个优化是交换rovarSprak 的两行:
rovarSprak :: [字符] -> [字符]
rovarSprak (c:restOfStr)
| checkCons c =
c : 'o' : c : (rovarSprak restOfStr)
|否则 =
c : rovarSprak restOfStr
罗瓦斯普拉克 [] = []
这是因为您更有可能在第一行找到匹配项:对于长度为 N 的列表,第一个模式将有 N 个调用,并且one 在第二个模式上。