1

我想删除以“h”开头的列表中的每个字符串。

["hawrw", "basw", "HasD" , "hgkas"] => ["basw", "HasD"]

我的代码是:

kat (x:xs) = if head x == "h" then kat(xs) else x ++ kat(xs)

为什么它不起作用?我该如何修复我的代码?

4

3 回答 3

4
  • 您需要一个基本案例:kat [] = []
  • "h"是一个字符串,你想比较一个字符,使用:'h'
  • ++是字符串连接,你想创建一个列表,用 . 替换它:

笔记:

  • head不安全,并且会以空""字符串失败。您可以使用null x.
  • 惯用的方法是使用filter,因为你真的在过滤。
  • 使用类型签名及早检测错误并获得更有意义的错误消息。
于 2013-05-08T00:57:24.663 回答
2

filterList = filter (\x -> head x /= 'h')

您的代码不起作用,因为 a 的头部String不是 a StringChar当你使用它时,"h"你的意思是String只有一个元素。

于 2013-05-08T01:00:20.107 回答
2

当然 Diego 的过滤器解决方案是首选的“真实世界”风格,但如果你想修复你的例子,为什么不使用更多的模式匹配呢?毕竟,字符串只是列表。

kat (('h':_):xs) = kat xs
kat (x:xs) = x : kat xs
kat [] = []

另一个不错的方法是使用列表推导:

kat xs = [ys | ys@(y:_) <- xs, y /= 'h']
于 2013-05-08T09:15:47.357 回答