2016-03-25 20 views
1

eine Liste der Liste Gegeben:Haskell: Wie filtere ich eine Liste?

xss = [[1,2,3],[4,5,6],[7,8]] 

Ich mag es von Listengröße von Rest dann filtern und dann eine Liste von Int zurück.

Hier sind meine zwei Versuche:

concat [[x | x <- xs, mod x 2 == 0] | xs <- xss, length xs > 2] 

filter (\x -> mod x 2 == 0) $ concat $ filter (\x -> length x > 2) xss 

Gibt es ausdrucksvollen Weg, um die gleichen, aber mit weniger Code zu tun?

+0

'[x | xs <- xss, Länge xs> 2, x <- xs, mod x 2 == 0] '. aber die Antwort von chi ist besser, produktiver * (funktioniert für '[[1 ..]]]'). –

Antwort

5

Es gibt eine eingebaute even-Funktion in Haskell, und Sie können auch Hilfe zur Konvertierung in Punkt-freien Stil mit Blunt erhalten. Dies gibt Ihnen:

filter even . concat . filter ((> 2) . length) 
+0

'Länge' ist eine teure Funktion zu verwenden, wenn Sie nur darauf achten, dass es mindestens 3 Elemente gibt: Was ist, wenn die Liste eine Million Elemente hat? Besser ist es, '((> 2). Length)' durch etwas wie '(not. Null. Drop 2)' zu ersetzen. – amalloy

+0

Das ist ein guter Punkt. Ich ziehe es jedoch vor, den Treffer in Lesbarkeit zu nehmen, wenn und wenn die Handhabung großer Listen zu einer tatsächlichen Anforderung wird. –

3

Eine einzige Liste Verständnis genügt

[x | [email protected](_:_:_:_) <- xss, x <- xs, mod x 2 == 0] 

Das Muster (_:_:_:_) Matches alle Listen mindestens drei Elementen.

Verwandte Themen