2013-05-08 73 views
1

我想删除列表中以“h”开头的每个字符串。Haskell多维列表:初学者问题

[ “hawrw”, “basw”, “HasD”, “hgkas”] => [ “basw”, “HasD”]

我的代码是:

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

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

+3

定义 “不工作” – 2013-05-08 00:53:33

+0

:1:4: 无法比拟预期的类型'[[[字符] ]' '与实际类型'(t0,t1)' 在'kat'的第一个参数中,即'(“abc”,“hef”)' 在表达式中:kat(“abc”,“hef”) 在'it'的等式中:it = kat(“abc”,“hef”) 这就是e我得到了。 我只想检查每个字符串的第一个元素是否为“h”或不。 如果它是==“h”那么我只是采取列表的其余部分,并将其放入我的功能 如果它不是==“h”,那么我想保留第一个字符串,并将其余的列表。 – Valakor 2013-05-08 01:00:48

回答

4
  • 你需要一个基本情况:kat [] = []
  • "h"是一个字符串,你要比较一个字符,请使用:'h'
  • ++是字符串连接,您要创建一个列表,将其替换为:

注:

  • head是不是安全,并会失败,一个空字符串""。您可以使用null x进行测试。
  • 惯用的方法是使用filter,因为你真的过滤。
  • 使用类型签名可以及早发现错误并获得更有意义的错误消息。
+0

谢谢我是功能编程新手。 – Valakor 2013-05-08 01:09:16

2

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

您的代码不beause一个String头工作是不是String。当您使用"h"时,这是一个Char,您的意思是仅有一个元素的String

+0

非常感谢 – Valakor 2013-05-08 01:09:35

2

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

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

另外一个不错的方法是使用列表理解:

kat xs = [ys | [email protected](y:_) <- xs, y /= 'h']