Haskell中使用匿名函数实现fold折叠时类型匹配错误如何解决
错误原因
foldl传入的二元函数参数数量不符合要求:foldl的第一个参数必须是接收累加值、当前遍历元素两个入参的函数,你写的匿名函数只接收了1个参数,类型匹配失败直接抛出报错。- 变量名冲突:你将输入字符串命名为
a,和匿名函数中用到的变量混淆,逻辑完全偏离需求,你原本想判断当前字符是否为'a',实际代码里判断的逻辑和拼接逻辑都错误引用了输入字符串本身。 - 累加逻辑错误:你当前的代码是直接拼接整段输入字符串,不是将当前处理后的字符拼接到累加结果中,完全达不到单个元音加倍的效果。
修复代码
兼容foldl写法
doubleVowels :: String -> String doubleVowels str = foldl (\acc curr -> if curr == 'a' then acc ++ "aa" else acc ++ [curr]) "" str
更优的foldr写法
字符串是Char类型的列表,右折叠不需要每次遍历整个累加字符串做拼接,执行效率更高:
doubleVowels :: String -> String doubleVowels str = foldr (\curr acc -> if curr == 'a' then 'a':'a':acc else curr:acc) "" str
后续要扩展到所有元音,只需要把判断条件curr == 'a'改成curr elem ['a','e','i','o','u']即可。
内容的提问来源于stack exchange,提问作者Sorun
相关产品推荐
相关产品推荐

