2017-03-21 2 views
0

Ich habe einige Zeit jetzt gesucht und ich konnte nicht finden, wie man das macht. Angenommen, ich habe zwei Listen, möchte ich eine neue Liste zurückgeben, die die gleiche ist wie das Ergebnis von zip, aber ohne die Duplikate, z. B. gegeben [1,2,3] und [4,5,6] wäre das Ergebnis [1,4,2,5,3,6]. Ich würde es tun wie (suppossing die Compiler keinen Fehler erzeugen):Wie man zwei Elemente in eine Verständnisliste in haskell setzt

myFunc xs ys = [x,y|(x,y) <- zip xs ys] 

PS: Hat es mit Liste Verständnis zu tun.

Könnten Sie ein paar Gedanken dazu geben?

+4

'[z | (x, y) <- zip xs ys, z <- [x, y]] ' – Alec

+1

Was ist mit concat [[x, y] | (x, y) <- zip xs ys] '? –

+0

@ WillemVanOnsem Das Ergebnis sollte eine flache Liste sein. – dcg

Antwort

2

Wahrscheinlich möchten Sie -XParallelListComp, die eine syntaktische Zucker für zip ist. Anders als das Zucker entspricht die Lösung, was bereits vorgeschlagen wurde:

{-# LANGUAGE ParallelListComp #-} 

xs = [1..3] 
ys = [4..6] 
ls = concat [ [x,y] | x <- xs | y <- ys ] 

Mit einem Ergebnis von:

*Main> ls 
[1,4,2,5,3,6] 
+0

Gibt es irgendwelche Verwendungen von '-XParallelListComp' in freier Wildbahn? Ich habe schon vorher davon gehört, aber ich habe nie die Motivation dahinter verstanden, warum es überhaupt eingeführt wurde ... – Alec

+0

Sicher, google einfach nach 'site: hackage.haskell.org LANGUAGE ParallelListComp'. Manifolds, Kansas Lava, viele viele Seiten von Paketen. Woher kam es? Cryptol hatte dieses Feature zuerst, denke ich. Es ist praktisch, deshalb ist es. –

+0

@ Alec Ich glaube nicht, dass ich sie jemals benutzt habe, aber ich klassifiziere sie immer noch im "nice to have" -Bucket, da sie ziemlich einfach zu verstehen sind. Stattdessen finde ich SQL-ähnliche Übersichten ziemlich fremdartig. – chi

1
func a b = concat (map (\(x,y) -> [x,y]) (zip a b)) 

Meinen Sie so etwas?

+0

'foldr (++) []' ist eine seltsame Funktion zum Schreiben, da sie 'concat' oder' join' entspricht. – amalloy

+0

Das ist richtig, ich habe vergessen, dass das eine eingebaute Funktion war. Ich bearbeite die Antwort. – Sacha

1

Dies kann auch bequem ohne Erweiterungen erfolgen:

myFunc xs ys = [x | pairs <- transpose [xs, ys], x <- pairs] 

Diese nicht weg werfen Elemente wie Thomas M. Dubuisson Antwort tut; z.B. myFunc [] [1] wird [1], nicht [] sein. Ob das wünschenswert ist oder nicht, hängt natürlich von Ihren Bedürfnissen ab.

Noch einfacher ist es jedoch, Listenübersichten gar nicht zu verwenden, so dass Sie den Intermediär pairs nicht nennen müssen.

myFunc xs ys = concat (transpose [xs, ys]) 
Verwandte Themen