2016-11-30 23 views
0

Ich habe eine Liste der Liste als:Haskell: Sortieren nach Höhe in absteigender Reihenfolge

[[4,7,9],[7,4,9],[9,4,7],[5,8,9],[8,5,9],[9,5,8]]

sortiere ich sie umkehren wollen basierend auf Grundfläche (3. Seite)

zB. sort [[4,7,9],[5,8,9]] sollte [[5,8,9],[4,7,9]] seit 4 + 7 = 11 < 5 + 8 = 13

ich die folgende Funktion implementiert haben ergeben:

quicksort (s:xs) = quicksort[x | x <- xs, x!!0+x!!1 < s!!2] ++ [s] ++ quicksort[x | x <- xs, x!!0+x!!1 >= s!!2]

Aber es ist nicht die richtige Ausgabe geben.

Jede Hilfe wäre willkommen.

+0

Wie haben Ein allgemeiner Hinweis, fast unlesbares Listenverständnis sollte vermieden werden. Versuchen Sie immer, einen Prelude-Algorithmus mit einem Lambda in diesem Szenario zu verwenden! –

+0

Wahrscheinlich sollten beide Instanzen von 's !! 2'' s !! 0 + s !! 1' sein. Mit dieser Änderung (und dem offensichtlichen Grundfall) scheint Ihr Code zu tun, wonach Sie fragen. –

Antwort

5

Warum nicht sortOn verwenden, die genau für diese Art (kein Wortspiel beabsichtigt) Ding gemacht wird? Dann können Sie diese in einer Zeile tun:

ghci> import Data.List (sortOn) 
ghci> sortOn (\[x,y,z] -> negate (x+y)) [[5,8,9],[4,7,9],[9,4,7],[8,5,9],[9,5,8],[7,4,9]] 
[[9,5,8],[5,8,9],[9,4,7],[8,5,9],[4,7,9],[7,4,9]] 

Davon abgesehen, wenn Sie Ihre innere Listen immer Länge 3 haben, sollten sie wahrscheinlich Tupeln stattdessen sein, in welchem ​​Fall würden Sie

ghci> sortOn (\(x,y,z) -> negate (x+y)) [(5,8,9),(4,7,9),(9,4,7),(8,5,9),(9,5,8),(7,4,9)] 
[(9,5,8),(5,8,9),(9,4,7),(8,5,9),(4,7,9),(7,4,9)] 
+0

'negate' ist in Ordnung, es gibt auch [' Down'] (https://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Ord.html#t:Down), das eine Bestellung umkehrt und ist, was ich hier gewählt hätte, denke ich. – luqui

Verwandte Themen