2016-05-08 9 views
1

Eine der Fragen, die in einem meiner Vorträge bis kam, war die folgende:Haskell Punktpunktnotation auf Liste - unerwartete Ausgabe

trips :: [(Int, Int, Int)] 
trips = [ (x,y,z) | z <- [2..], y <- [2..z-1], x <- [2..y-1] ] 

What is the first five elements output? 

Jetzt dachte ich, ich war bewusst, wie Punktpunktnotation gearbeitet, aber als ich Setzen Sie die oben genannten in einen Compiler der Ausgabe ist:

(2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5), (2, 3 , 6) usw.

Wie passiert das?

Ich dachte, wenn Dinge mit [2 ..] begannen, dann würden alle folgenden Listen mit zwei beginnen? z ist definiert als [2 ..] und zeigt niemals einmal 2 als drittes int an. Ich vermisse hier offensichtlich etwas, aber ich bin mir nicht ganz sicher was.

+1

Stellen Sie sich eine For-Schleife vor, die die Verschachtelung von links nach rechts erhöht. – ThreeFx

Antwort

6
[ (x,y,z) | z <- [2..], y <- [2..z-1], x <- [2..y-1] ] = 
[ (x,y,2) | y <- [2..2-1], x <- [2..y-1] ] ++ 
[ (x,y,3) | y <- [2..3-1], x <- [2..y-1] ] ++ 
[ (x,y,4) | y <- [2..4-1], x <- [2..y-1] ] ++ 
... = 
[ (x,y,2) | y <- [2..1], x <- [2..y-1] ] ++ 
[ (x,y,3) | y <- [2..2], x <- [2..y-1] ] ++ 
[ (x,y,4) | y <- [2..3], x <- [2..y-1] ] ++ 
... = 
[ (x,y,2) | y <- [], x <- [2..y-1] ] ++ 
[ (x,y,3) | y <- [2], x <- [2..y-1] ] ++ 
[ (x,y,4) | y <- [2,3], x <- [2..y-1] ] ++ 
... 

Hinweis der Bereich y <- [2..2-1] d.h. y <- [2..1] d.h. y <- []. Aus diesem Grund gibt es keine Tripel (x,y,2) zu generieren.

Ähnlich, wenn y2 ist, ist der Bereich z <- [2..y-1] nichts erzeugen, und wir nicht bekommen, Tripel der Form (x,2,3).