2016-06-25 3 views
0

Ich benutze zipWith. Ich bekomme die richtigen Ergebnisse, aber mit falschen Zeichen. Wie repariere ich es? Wo gehe ich falsch?Berechne den Unterschied zwischen aufeinanderfolgenden Elementen in einer gegebenen Liste von Ganzzahlen

diff :: [Int] -> [Int] 
diff [] = [] 
diff x = zipWith (-) (tail x) x 

Ergebnis:

diff [4,2,7,3,6,5] 
[-2,5,-4,3,-1] 

Ich möchte:

[2,-5,4,-3,1] 
+1

'zipWith (-) x (Schwanz x)' – pdexter

+0

@pdexter, wenn Sie es als Antwort setzen, ich werde genehmigen –

+0

Beachten Sie, dass Sie könnten einfach 'diff x = zipWith (-) x (tail x)' ohne den Basisfall von '[]' schreiben, denn wenn 'x' leer ist, wird' zipWith' nicht das zweite Argument auswerten und somit wird 'tail' nicht ausgelöst eine Ausnahme. – Bakuriu

Antwort

4

Wie haben Sie es jetzt bist du [2-4,7-2,3-7,6-3,5-6] berechnen. Wenn Sie die Reihenfolge der Argumente zu zipWith (-) x (tail x) tauschen, dann werden Sie es zu [4-2,2-7,7-3,3-6,6-5] korrigieren

+3

Und als etwas subtiler Nebeneffekt hörst du auch auf "[]" zu stürzen. –

+1

Sie können es auch ein wenig abkürzen, wie 'diff = (zipWith (-)) <*> tail' (ohne Punkt und ohne expliziten Basisfall) (obwohl weit weniger lesbar, bis Sie sich an' <*> 'gewöhnt haben). – chepner