从列表的所有元素中的字符串中删除字符

时间:2019-04-21 00:46:07

标签: list dictionary haskell

我试图在列表中替换所有包含子字符串的字符串。 我已经通过使用map函数进行了尝试:

cleanUpChars = map(\w -> if isInfixOf "**" w then map(\c ->  if c == "*" then ""; else c); else w)

对我来说,它的含义是:映射列表中的元素,例如,如果单词的字符包含*,则不添加任何内容

对Haskell:“无法将表达式中的实际类型[Char]与期望的类型[[Char]]-> [[Char]]匹配:w”(最后一个带下划线的w)

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

要回答修订后的问题(当isInfixOf已正确import时):

cleanUpChars = map(\w -> if isInfixOf "**" w then map(\c ->  if c == "*" then ""; else c); else w)

最明显的错误是,内括号中的c将是Char(因为它是在{{1} })-字符使用单引号而不是双引号。这不仅是拼写错误或语法错误的情况,但是-map可以很好地用作空字符串(并且由于字符串只是列表,因此等效于String),但是没有这样的东西作为“空字符”。

如果看起来您的目标是从包含""的列表中的每个字符串中删除所有[],那么正确的工具是*而不是{{1 }}:

**

(请注意,在我组成的示例中,它删除了filter中的所有星号,甚至单个星号。这可能不是您真正想要的,但这是您在错误版本中的逻辑所暗示的-您'必须稍微复杂一点才能只删除成对的连续map。)

PS我肯定不会用分号来编写那样的函数-它确实不会给您带来任何好处。我还将使用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

对于可读性,我仍然不是特别满意-可能有一些很好的方法来整理它,而我现在忽略了它。但是,即使不是,也可以帮助imo赋予功能本地名称(希望您能比我的版本更简洁!):

*