我想删除列表中以"h"开头的每个字符串。
["hawrw","basw","HasD","hgkas"]=>["basw","HasD"]
我的代码是:
kat (x:xs) = if head x == "h" then kat(xs) else x ++ kat(xs)
为什么它不起作用?我该如何修复我的代码?
- 您需要一个基本案例:
kat [] = []
"h"
是一个字符串,如果要与字符进行比较,请使用:'h'
++
是字符串串联,如果要创建一个列表,请将其替换为:
注:
head
是不安全的,并且将以空的""
字符串失败。您可以使用null x
对此进行测试- 惯用的方法是使用
filter
,因为您实际上是在过滤 - 使用类型签名可以及早检测错误,并获得更有意义的错误消息
filterList = filter (x -> head x /= 'h')
因为String
的头部不是String
,所以您的代码不起作用。它是Char
当你使用"h"
时,你指的是只有一个元素的String
。
当然,Diego的过滤器解决方案是首选的"真实世界"风格,但如果您想修复您的示例,为什么不使用更多的模式匹配呢?毕竟,字符串只是列表。
kat (('h':_):xs) = kat xs
kat (x:xs) = x : kat xs
kat [] = []
另一个不错的方法是使用列表综合:
kat xs = [ys | ys@(y:_) <- xs, y /= 'h']