2017-09-16 4 views
2

Ich bin ein Haskell Anfänger, also Entschuldigung im Voraus.Wie kann ich eine Liste in Haskell filtern?

Ich analysiere einige HTML-Werte (<a name="value-to-extract">) mit HXT und Haskell. Ich kann eine Liste von a name=""name Werte erhalten diese mit:

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

Wenn ich dies tun:

print anames 

Dann druckt er diese Liste:

["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","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"]

Jetzt möchte ich Entfernen Sie alle Einträge, die "" sind.

Also versuche ich

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

Aber ich bekomme diese Fehlermeldung:

• 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 

Ich denke, das ein Tipp Problem ist, so dass ich versuchen:

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

Und es sagt mir, dass der Typ aname[Char] ist. Wenn ich den Filterbefehl in Ghci versuche, funktioniert es wie erwartet. Was fehlt mir hier?

+1

Das Problem ist mehr, dass 'filter' nicht monadischen ist ... –

+0

schreiben' lassen nonEmptyANames = Filter (\ s -> s/= "") anames' –

Antwort

5

filter hat Unterschrift:

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

So ist es nicht monadischen. In diesem Fall können Sie einen Ausdruck let verwenden. Sie ersetzen sollte nonEmptyANames <- filter (\s -> s /= "") anames mit:

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