Haskell中如何从字符串中移除指定字符?
问题解答
原实现正确性判定
你给出的实现完全无法通过编译,是错误的,核心问题如下:
- 类型不匹配:Haskell 中
String是[Char]的别名,你对输入字符串做map操作时,遍历到的每个元素都是单个Char类型,而filter要求第二个入参是可折叠的集合类型,传入单个字符会直接触发类型报错。 - 逻辑冗余错误:你定义的
f函数中用到elem a x,elem同样要求第二个参数是Foldable结构,无法接收单个Char作为入参;外层的foldr (++) []属于完全多余的操作,没有任何实际作用。
最简高效实现
直接使用Haskell内置的filter函数即可一行完成需求,完全符合类型定义:
removeChar :: Char -> String -> String removeChar c = filter (/= c)
说明:
filter函数的作用是筛选列表中所有符合条件的元素,类型(a -> Bool) -> [a] -> [a]刚好匹配我们的输入输出要求。- 偏函数
/= c用来判断当前字符不等于需要移除的目标字符,仅保留符合要求的字符。 - 该实现仅需遍历字符串一次,无额外的集合拼接开销,效率远高于你原本的实现逻辑。
如果需要手动实现递归版本,可写为:
removeChar :: Char -> String -> String removeChar _ [] = [] removeChar target (x:xs) | x == target = removeChar target xs | otherwise = x : removeChar target xs
这个版本和filter实现的效率基本一致,逻辑也非常直观。
内容的提问来源于stack exchange,提问作者haskelldude
相关产品推荐
相关产品推荐

