Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 从列表中所有元素的字符串中删除字符_List_Dictionary_Haskell - Fatal编程技术网

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
,朋友们显然属于这一类