我试图在列表中替换所有包含子字符串的字符串。
我已经通过使用map
函数进行了尝试:
cleanUpChars = map(\w -> if isInfixOf "**" w then map(\c -> if c == "*" then ""; else c); else w)
对我来说,它的含义是:映射列表中的元素,例如,如果单词的字符包含*,则不添加任何内容
对Haskell:“无法将表达式中的实际类型[Char]与期望的类型[[Char]]-> [[Char]]匹配:w”(最后一个带下划线的w)
感谢您的帮助
答案 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赋予功能本地名称(希望您能比我的版本更简洁!):
*