我有一个列表清单:
[[4,7,9],[7,4,9],[9,4,7],[5,8,9],[8,5,9],[9,5,8]]
我想根据基本区域(第3面)对它们进行反向排序
例如。 sort [[4,7,9],[5,8,9]]
应该产生[[5,8,9],[4,7,9]]
因为4 + 7 = 11< 5 + 8 = 13
我已实现以下功能:
quicksort (s:xs) = quicksort[x | x <- xs, x!!0+x!!1 < s!!2] ++ [s] ++ quicksort[x | x <- xs, x!!0+x!!1 >= s!!2]
但它没有给出正确的输出。
任何帮助都将不胜感激。
答案 0 :(得分:5)
为什么不使用sortOn
完全用于此类(没有双关语)的东西?然后,您可以在一行中执行此操作:
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]]
除此之外,如果你的内部列表总是长度为3,那么它们可能应该是元组,在这种情况下,你会有
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)]