回答修改后的问题(当isInfixOf 已正确imported 时):
cleanUpChars = map(\w -> if isInfixOf "**" w then map(\c -> if c == "*" then ""; else c); else w)
这里最明显的错误是内括号中的c 将是Char(因为它是mapped 超过String 的函数的输入)-并且字符使用单引号,而不是双引号。但是,这不仅仅是拼写错误或语法错误的情况 - "" 可以作为空字符串正常工作(并且等效于 [],因为字符串只是列表),但不存在“空字符”。
如果看起来您的目标是从包含** 的列表中的每个字符串中删除所有*s,那么正确的工具是filter 而不是map:
Prelude Data.List> cleanUpChars = map(\w -> if isInfixOf "**" w then filter (/= '*') w; else w)
Prelude Data.List> cleanUpChars ["th**is", "is", "a*", "t**es*t"]
["this","is","a*","test"]
(请注意,在我编写的示例中,它删除了 t**es*t 中的所有星号,甚至是单个星号。这可能不是您真正想要的,但这是您在错误版本中所暗示的逻辑 - 您将必须稍微复杂一点才能仅删除连续的* 对。)
PS 我绝对不会用分号写出这样的函数——它真的不会给你带来任何好处。我还会使用isInfixOf 的中缀形式,这样可以更清楚您在另一个字符串中查找的字符串:
cleanUpChars :: [String] -> [String]
cleanUpChars = map (\w -> if "**" `isInfixOf` w then filter (/= '*') w else w)
我对它的可读性仍然不是特别满意 - 可能有一些我现在忽略的好方法来整理它。但即使不是,它也有助于 imo 为函数提供本地名称(希望你能想出一个比我的版本更简洁的名称!):
cleanUpChars :: [String] -> [String]
cleanUpChars = map possiblyRemoveAsterisks
where possiblyRemoveAsterisks w = if "**" `isInfixOf` w then filter (/= '*') w else w