如何在Haskell中过滤列表?

时间:2017-09-16 19:38:25

标签: haskell

我是Haskell的初学者,所以请提前道歉。

我正在使用HXT和haskell解析一些HTML值(<a name="value-to-extract">)。我可以使用以下代码获取a name="" name值列表:

anames <- runX $ parseHtml contents >>> css "a" >>> getAttrValue "name"

如果我这样做:

print anames

然后打印此列表:

["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","2H_4_0001","2HCH0001","2HCH0002","2HCH0003","2HCH0004","2HCH0005","2HCH0006","2HCH0007","2HCH0008","2HCH0009","2HCH0010","2HCH0011","2HCH0012","2HCH0013","2HCH0014","2HCH0015","2HCH0016","2HCH0017","2HCH0018","2HCH0019","2HCH0020","2HCH0021","2HCH0022","2HCH0023","2HCH0024","2HCH0025","2HCH0026","2HCH0027","2HCH0028","2HCH0029","2HCH0030","2HCH0031","2H_4_0033"]

现在我要删除""的所有条目。

所以我试试

nonEmptyANames <- filter (\s -> s /= "") anames

但是我收到了这个错误:

• Couldn't match type ‘[]’ with ‘IO’
  Expected type: IO String
    Actual type: [String]
• In a stmt of a 'do' block:
    nonEmptyANames <- filter (\ s -> s /= "") anames

我认为这是打字问题,所以我试试:

putStrLn ("type of aname is: " ++ (show (typeOf anames)))

它告诉我aname的类型是[Char]。如果我在ghci中尝试过滤命令,它会按预期工作。我在这里错过了什么?

1 个答案:

答案 0 :(得分:5)

filter有签名:

filter :: (a -> Bool) -> [a] -> [a]

所以它不是monadic。在这种情况下,您可以使用let表达式。您应该将nonEmptyANames <- filter (\s -> s /= "") anames替换为:

    let nonEmptyANames = filter (\s -> s /= "") anames