2016-05-01 15 views
2

Ich frage mich, ob es möglich ist, mehrere Elemente zu einer Liste innerhalb eines Listenverständnisses hinzuzufügen.Ist das Hinzufügen mehrerer Elemente in einem Listenverständnis möglich?

Zum Beispiel, wenn ich eine Liste will, bestehend aus den Zahlen 1 bis 10, kann ich schreiben:

[k | k <- [1..10]] 

Allerdings gibt es auch eine Möglichkeit, dies durch immer zu tun Zugabe kundk+1 in der gleiche Schritt, und nehmen Sie nur die ungeraden Zahlen k? Folgende Code ist ungültig, aber vielleicht erklärt besser, was ich versuche zu tun:

[k, k+1 | k <- [1, 3..10]] 

Derzeit ist die nächste Sache, diese (die ich bin mir dessen bewusst) ist die folgende:

foldl1 (++) [[k, k + 1] | k <- [1, 3..10]] 

Antwort

6

Es gibt einige Alternativen, von denen keine wesentlich besser als das ist, was Sie vorschlagen.

concat [ [k, k+1] | k <- [1, 3 .. 10] ] 
join [ [k, k+1] | k <- [1, 3 .. 10] ] 
[ x | k <- [1, 3 .. 10], x <- [k,k+1] ] 
[1, 3 .. 10] >>= (\x -> [x, x + 1]) 
do x <- [1, 3 .. 10] ; [x, x+1] 

Beachten Sie, dass foldl1 (++), wie sie in Ihrer Lösung, wird das Programm mit einem Laufzeitfehler abgebrochen, wenn es sich um eine leere Listen-of-Listen findet. Die obigen Alternativen haben kein solches Problem.

+0

Vielen Dank für Ihre Antwort und die Bereitstellung von Alternativen! – flawr

+2

Eine andere ist '[1, 3 .. 10] >> = (\ x -> [x, x + 1])'. – Jubobs

+1

... oder äquivalent "do" 'x <- [1, 3 .. 10]' '[x, x + 1]'. – leftaroundabout