从输入Haskell中删除元素

从输入Haskell中删除元素,haskell,recursion,list-comprehension,haskell-platform,Haskell,Recursion,List Comprehension,Haskell Platform,我想让函数remove::String->Char->String 这将删除第二个参数中字符的所有实例 从第一个参数中的字符串。例如: 删除“ab-cd-ef”'==“abcdef” 删除“ab cd cf”'c'==“ab d f” 到目前为止,我得到的是: remove (x:xs) y | x == y = xs | otherwise = x : remove xs y 这仅删除一个元素,例如,如果我写入删除“ab cd ef”' 它打印出“abcd

我想让函数
remove::String->Char->String
这将删除第二个参数中字符的所有实例 从第一个参数中的字符串。例如:

删除“ab-cd-ef”'==“abcdef”

删除“ab cd cf”'c'==“ab d f”

到目前为止,我得到的是:

remove (x:xs) y 
     | x == y     = xs
     | otherwise  = x : remove xs y

这仅删除一个元素,例如,如果我写入
删除“ab cd ef”'
它打印出
“abcd ef”
,而不是
“abcdef”


我需要使用递归创建一个函数,使用列表理解创建另一个函数。

正如chi在评论中指出的,您需要在两个分支中使用递归,否则最终只会删除第一个实例

为了完整起见,以下是正确的代码:

删除[].[]
移除(x:xs)y
|x==y=删除xs y
|否则=x:删除xs y
如果不包括
[]
案例,那么您将得到一个关于模式匹配的错误——这是因为当您匹配模式
(x:xs)
时,您假设要定义的
x
的数组长度为>=1。如果您想到像
data List a=Cons a(List a)| Empty
这样的列表,那么任何采用列表的函数都必须在
Cons
Empty
构造函数上进行模式匹配。显然,如果您有一个空字符串,则没有任何内容可删除,因此所有
y
[]
都映射到
[]

如果您还需要列表理解,请认识到列表理解是
map
filter
的组合。我们不想更改
map
允许我们更改的字符,只想筛选出与
y
匹配的字符


语法
[f x | x在这两种情况下都必须递归,否则只会删除第一个实例。谢谢!这会给我“函数删除中的非穷举模式”。我的类型签名错误吗?(我现在删除了模板:))@Mali99啊,我的错。我忘记了空列表框,现在添加了。你对我如何在这个函数中使用列表理解有什么建议吗?:)@Oliver@Mali99是的,我也加了。希望这有帮助!你的回答对我帮助很大!谢谢:)