从输入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是的,我也加了。希望这有帮助!你的回答对我帮助很大!谢谢:)