List 从列表中所有元素的字符串中删除字符
我试图替换列表中包含子字符串的所有字符串。 我已经通过使用List 从列表中所有元素的字符串中删除字符,list,dictionary,haskell,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”(最后一个
map
功能进行了尝试:
cleanUpChars = map(\w -> if isInfixOf "**" w then map(\c -> if c == "*" then ""; else c); else w)
对我来说,这可以理解为:映射列表中的元素,如果单词的某个字符包含*则将其替换为空
对于Haskell:“无法将表达式中的预期类型[[Char]]->[[Char]]与实际类型[Char]匹配:w”(最后一个w带下划线)
如需回答修改后的问题(当
isInfixOf
已正确导入import
时),欢迎提供任何帮助:
这里最明显的错误是内括号中的c
将是一个Char
(因为它是一个函数的输入,该函数是map
ped在String
上的)字符使用单引号,而不是双引号。这不仅仅是拼写错误或语法错误的情况,但是-“”
可以作为空字符串使用(由于字符串只是列表,因此相当于“[]
”),但不存在“空字符”这类东西
如果您的目标似乎是从包含**
的列表中的每个字符串中删除所有*
,那么正确的工具是过滤器
,而不是映射
:
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)
我仍然对它的可读性不是特别满意——可能有一些很好的方法来整理它,我现在忽略了。但是,即使没有,给函数一个本地名称也有助于提高可读性(希望您能想出一个比我的版本更简洁的名称!)
要回答修改后的问题(当
isInfixOf
已正确导入import
时):
这里最明显的错误是内括号中的c
将是一个Char
(因为它是一个函数的输入,该函数是map
ped在String
上的)字符使用单引号,而不是双引号。这不仅仅是拼写错误或语法错误的情况,但是-“”
可以作为空字符串使用(由于字符串只是列表,因此相当于“[]
”),但不存在“空字符”这类东西
如果您的目标似乎是从包含**
的列表中的每个字符串中删除所有*
,那么正确的工具是过滤器
,而不是映射
:
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)
我仍然对它的可读性不是特别满意——可能有一些很好的方法来整理它,我现在忽略了。但是,即使没有,给函数一个本地名称也有助于提高可读性(希望您能想出一个比我的版本更简洁的名称!)
您是否从数据列表导入函数?太累了!谢谢我的逻辑似乎仍然是错误的,因此编辑您不需要分号。您是否从
数据导入了函数。列表
?太累了!谢谢我的逻辑似乎仍然是错误的,所以editedYou不需要分号!一个简单的例子是,“'s around”是什么意思/做什么?倒勾只允许你在“中缀形式”中使用它-在两个参数之间,而不是在它们之前。你可以用两个参数的任何函数来实现这一点,但是有些函数在中缀形式下读起来更好,在我看来,isInfixOf
,朋友们显然属于这一类信息性的&很好的答案,谢谢!一个简单的例子是,“'s around”是什么意思/做什么?倒勾只允许你在“中缀形式”中使用它-在两个参数之间,而不是在它们之前。你可以用两个参数的任何函数来实现这一点,但是有些函数在中缀形式下读起来要好得多,在我看来,isInfixOf
,朋友们显然属于这一类