Haskell多维列表:初学者问题



我想删除列表中以"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']

相关内容

  • 没有找到相关文章

最新更新